百万行级CSV按第三列排序时出现UnicodeDecodeError求助
问题分析与解决方案
错误根源
你遇到的UnicodeDecodeError并非由数据量直接导致,而是文件编码处理冲突:
- 代码中先用
open()打开文件时未指定编码,系统会使用默认编码(通常是UTF-8)读取文件; - 后续
pd.read_csv()指定的encoding='cp949'参数会被忽略——因为传入已打开的文件对象时,pandas会沿用文件对象的编码,而非自己指定的编码。 - 小文件里恰好没有超出UTF-8编码范围的字节,所以运行正常;大文件中出现了CP949编码的特殊字节(比如
0xc0),UTF-8解码失败就触发了错误。
修复方案
方案1:直接传入文件路径给pandas(推荐)
让pandas自行处理文件打开和编码,避免编码冲突:
#!/bin/python #aaa.py import sys import pandas as pd def main(argv): # 直接传文件路径,而非已打开的文件对象 df = pd.read_csv(argv[1], encoding='cp949') sorted_df = df.sort_values(by='c') sorted_df.to_csv("output_sorted.csv", encoding='cp949') # 输出指定编码避免乱码 if __name__ == "__main__": main(sys.argv)
方案2:打开文件时指定对应编码
如果必须手动打开文件,要确保open的编码和pandas一致:
#!/bin/python #aaa.py import sys import pandas as pd def main(argv): # open时指定cp949编码 with open(argv[1], "r", encoding='cp949') as f: df = pd.read_csv(f) sorted_df = df.sort_values(by='c') sorted_df.to_csv("output_sorted.csv", encoding='cp949') if __name__ == "__main__": main(sys.argv)
大数据量优化建议
处理超100万行的CSV时,全量加载可能导致内存不足,可以考虑分块处理:
#!/bin/python #aaa.py import sys import pandas as pd def main(argv): chunk_size = 100000 # 每次处理10万行 chunks = [] # 分块读取并排序 for chunk in pd.read_csv(argv[1], encoding='cp949', chunksize=chunk_size): chunks.append(chunk.sort_values(by='c')) # 合并分块后全局排序 sorted_df = pd.concat(chunks).sort_values(by='c') sorted_df.to_csv("output_sorted.csv", encoding='cp949') if __name__ == "__main__": main(sys.argv)
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

