Python处理900万行CSV时遇Unicode编码及转义错误求助
解决Python处理大CSV文件时的Unicode编码/解码错误
我来帮你搞定这个编码问题,都是实际处理超大CSV时踩过的坑,分点给你讲清楚:
先搞懂两个错误的本质
- UnicodeEncodeError:这个报错是因为你在输出(打印、写入文件)时用了系统默认的
charmap编码(Windows下通常是cp1252),而字符é(十六进制转义是\xe9)不在这个编码的字符集里,所以没法编码输出。 - SyntaxError(truncated \xXX escape):你直接敲
print('\xe')报错是因为\x是十六进制转义符,后面必须跟两位十六进制数字,\xe是不完整的转义序列,正确的写法应该是print('\xe9')才能打出é。
处理900万行CSV的编码解决方案
因为是超大文件,要避免一次性加载全部内容到内存,推荐逐行处理:
1. 读取文件时指定正确编码
首先确定你的CSV文件实际编码(常见的是UTF-8),读取时显式指定:
import csv # 用utf-8编码读取大CSV,逐行处理 with open('your_large_file.csv', 'r', encoding='utf-8') as input_file: csv_reader = csv.reader(input_file) for row in csv_reader: # 这里处理每行数据,比如提取字段、清洗等 pass
2. 输出时避免编码错误
如果是写入新文件或者打印到控制台时出错,同样要显式指定UTF-8编码:
- 写入文件示例:
with open('output_file.csv', 'w', encoding='utf-8', newline='') as output_file: csv_writer = csv.writer(output_file) # 先写入表头(如果需要) csv_writer.writerow(['列1', '列2', '列3']) # 再逐行写入处理后的数据 for row in csv_reader: csv_writer.writerow(row)
- 控制台打印解决(Windows常见问题):
Windows控制台默认编码不是UTF-8,可能导致打印UTF-8字符报错,两种解决方法:
# 方法1:重新配置stdout编码为UTF-8 import sys sys.stdout.reconfigure(encoding='utf-8') # 方法2:手动编码后打印(适合临时调试) print(row[0].encode('utf-8').decode('utf-8'))
3. 不确定文件编码?用chardet检测
如果不知道CSV用的是什么编码,可以用chardet库检测(先pip install chardet):
import chardet # 只读前10KB内容检测,避免加载大文件占内存 with open('your_large_file.csv', 'rb') as f: raw_data = f.read(10000) encoding_result = chardet.detect(raw_data) print(f"检测到文件编码:{encoding_result['encoding']}")
检测结果比如是utf-8、cp1252或者gbk,读取时用这个编码就行。
4. 特殊情况:无法编码的字符处理
如果确实有一些无法用目标编码表示的字符,可以在写入/打印时添加errors参数兜底(不推荐,优先用正确编码):
# 用?替换无法编码的字符 with open('output.csv', 'w', encoding='utf-8', errors='replace', newline='') as f: csv_writer = csv.writer(f) # ...写入逻辑
内容的提问来源于stack exchange,提问作者Alaa M.
相关产品推荐
相关产品推荐

