You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3读取csv文件出现'charmap'解码错误如何解决

问题解答

1. 电影名称中的逗号是否是报错原因?

不是。你遇到的UnicodeDecodeError属于字符编码解析错误,是Python读取文件时使用的编码和文件实际编码不匹配导致的,和CSV内的分隔符、字段内容没有关系。
你在RStudio中可以正常读取,是因为R默认会自动尝试多种常见编码解析文件;而你代码里open("watched.csv")没有指定编码,Windows系统下Python默认会使用GBK/CP1252等系统编码打开文件,和文件实际编码不匹配才触发报错,且此时你写在pd.read_csv里的encoding='utf-8'参数完全没有生效。

2. 解码报错的解决方法

优先推荐直接把文件路径传给pd.read_csv,由pandas处理编码逻辑,不需要手动打开文件:

  • 尝试使用带BOM的UTF-8编码解析,这是Windows平台导出CSV的常用编码:
import pandas as pd
df = pd.read_csv("watched.csv", encoding='utf-8-sig')
  • 如果上述方案依然报错,可以使用latin-1编码兼容所有单字节字符,不会触发解码错误:
df = pd.read_csv("watched.csv", encoding='latin-1')
  • 如果需要精准匹配文件编码,可以用chardet库检测后再读取:
import chardet
import pandas as pd

# 读取二进制内容检测编码
with open("watched.csv", 'rb') as f:
    detect_result = chardet.detect(f.read())

df = pd.read_csv("watched.csv", encoding=detect_result['encoding'])

3. 电影名包含逗号的处理方案

解决编码问题后,你会遇到字段错位的问题,这才是电影名中的逗号导致的,你可以根据需求选择处理方式:

3.1 正确读取带逗号的电影名(保留逗号)

你的CSV每行固定3个字段,最后2个分别为YEAR和imdbID,可以手动拆分每行内容,把前面的部分合并为电影名:

import csv
import pandas as pd

data = []
with open("watched.csv", 'r', encoding='utf-8-sig') as f:
    reader = csv.reader(f)
    # 跳过表头
    next(reader)
    for row in reader:
        # 最后两个字段为年份、imdbID,前面的全部合并为电影名
        movie_name = ','.join(row[:-2])
        year = row[-2]
        imdb_id = row[-1]
        data.append([movie_name, year, imdb_id])

df = pd.DataFrame(data, columns=['MOVIE', 'YEAR', 'imdbID'])

3.2 删除电影名中的逗号

只需要修改合并电影名的逻辑,用空格替换逗号即可:

movie_name = ' '.join(row[:-2])

内容的提问来源于stack exchange,提问作者Jusep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:15:01