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

