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

百万行级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 18:46:15