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

Python如何将非UTF-8编码的CSV/Excel文件转码读取且不修改原文件

实现方案

核心思路

抛弃磁盘临时文件,直接使用io模块提供的内存级类文件对象承载转码后的内容,直接传入pandas的读取接口即可,全程不会产生任何本地文件,也不会修改原始文件。

封装函数

完整代码

import pandas as pd
import os
from io import StringIO, BytesIO

def read_non_utf8_file(file_path, decode_encoding="latin-1", file_type="auto", **kwargs):
    # 自动识别文件类型
    if file_type == "auto":
        suffix = os.path.splitext(file_path)[1].lower()
        if suffix in (".csv", ".tsv"):
            file_type = "csv"
        elif suffix in (".xls", ".xlsx", ".xlsb"):
            file_type = "excel"
        else:
            raise ValueError(f"不支持的文件格式{suffix},请手动指定file_type参数")
    
    # 读取原始二进制内容
    with open(file_path, "rb") as f:
        raw_bytes = f.read()
    
    if file_type == "csv":
        # 转码后封装为StringIO内存对象直接传给pandas
        decoded_text = raw_bytes.decode(decode_encoding)
        mem_file = StringIO(decoded_text)
        return pd.read_csv(mem_file, **kwargs)
    elif file_type == "excel":
        # Excel读取直接传入二进制流即可
        mem_file = BytesIO(raw_bytes)
        return pd.read_excel(mem_file, encoding=decode_encoding, **kwargs)

使用示例

# 读取编码错误的CSV
df_csv = read_non_utf8_file("path/to/bad_file.csv")
# 读取编码错误的Excel,指定sheet
df_excel = read_non_utf8_file("path/to/bad_file.xlsx", sheet_name="Sheet1")
# 如果latin-1解码不对可以换其他编码,比如gbk
df_gbk = read_non_utf8_file("path/to/gbk_file.csv", decode_encoding="gbk")

注意事项

  • 要是不确定原始文件编码,可以安装chardet模块检测编码,检测结果直接传给decode_encoding参数即可,准确率更高
  • 函数已经支持传入pandas读取接口的所有参数,比如sep、header、sheet_name等,直接当原生的pd.read_csv/pd.read_excel用就可以
  • 全程所有操作都在内存中完成,不会产生任何临时文件,也不会修改原始文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:36:03