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
相关产品推荐
相关产品推荐

