如何用glob无错打开多编码CSV文件或批量转码?
解决CSV文件编码不兼容问题:无错打开与批量转码
一、自动检测编码,无错打开文件
手动指定编码容易触发解码错误,最可靠的方式是自动检测文件编码后再读取。可以用chardet或cchardet库(后者性能更优,适合批量处理大量文件)。
操作步骤:
- 安装依赖库:
pip install chardet # 追求更快检测速度可选: pip install cchardet
- 编写Python代码,结合
glob遍历并自动适配编码打开文件:
import glob import chardet # 匹配目标文件夹下所有CSV文件,根据实际路径修改 csv_files = glob.glob("/your/csv/folder/path/*.csv") for file_path in csv_files: # 读取文件头部数据检测编码(避免读取整个文件,提升效率) with open(file_path, 'rb') as f: raw_head = f.read(10000) # 取前10KB足够完成编码检测 detect_result = chardet.detect(raw_head) file_encoding = detect_result['encoding'] # 处理检测结果为空的情况,默认 fallback 到utf-8 if not file_encoding: file_encoding = 'utf-8' # 用检测到的编码打开文件 try: with open(file_path, 'r', encoding=file_encoding) as f: # 此处可添加内容处理逻辑,比如读取为DataFrame content = f.read() print(f"成功打开:{file_path} | 编码:{file_encoding}") except Exception as e: # 极端场景下检测编码仍失败,用latin-1兜底(不会报错但可能出现乱码) with open(file_path, 'r', encoding='latin-1') as f: content = f.read() print(f"用latin-1兜底打开:{file_path} | 原检测报错:{str(e)}")
二、批量转换所有文件为UTF-8编码
如果希望一劳永逸解决编码问题,可将所有CSV统一转换为UTF-8编码,后续打开无需再适配编码。
代码示例:
import glob import chardet import shutil def convert_to_utf8(file_path, enable_backup=True): # 检测原文件编码 with open(file_path, 'rb') as f: raw_head = f.read(10000) detect_result = chardet.detect(raw_head) src_encoding = detect_result['encoding'] or 'latin-1' # 读取原文件内容 with open(file_path, 'r', encoding=src_encoding, errors='replace') as f: content = f.read() # 备份原文件(建议开启,防止转换出错丢失数据) if enable_backup: shutil.copy(file_path, f"{file_path}.bak") # 写入UTF-8编码的文件 with open(file_path, 'w', encoding='utf-8') as f: f.write(content) print(f"已转UTF-8:{file_path}") # 遍历目标文件夹下所有CSV文件 csv_files = glob.glob("/your/csv/folder/path/*.csv") for file in csv_files: convert_to_utf8(file)
注意事项:
enable_backup=True会生成原文件的备份(后缀.bak),确认转换无误后再清理备份文件。errors='replace'会将无法解码的字符替换为�,避免转换中断;若对数据精度要求极高,可改为errors='strict',但会跳过解码失败的文件。
内容的提问来源于stack exchange,提问作者Rfl
相关产品推荐
相关产品推荐

