循环读取Pandas生成的CSV文件时触发UnicodeDecodeError怎么办?
解码错误的核心成因与修复方案
错误根源
这个报错本质是读写两端编码不匹配,和重新生成多少次csv没有关联,核心问题有两个:
- 不管是pandas导出csv,还是Python内置的
open()方法,都没有显式指定编码参数,完全依赖当前系统的默认编码。在Windows环境下,不同版本Python、不同版本pandas的默认编码经常出现不一致:比如pandas导出时默认用UTF-8,open()读取时默认用GBK,就会碰到非UTF-8序列的字节触发解码错误。 - 读取代码存在明显逻辑漏洞:循环遍历文件名时,直接把遍历得到的文件名变量
file覆盖成了打开的文件对象,同时没有过滤文件夹内的非csv文件——os.listdir()会返回目录下所有文件,很容易把系统生成的隐藏文件(比如Thumbs.db、.DS_Store)当成csv读取,这类文件的二进制内容碰到文本读取逻辑就会触发解码错误,刚好匹配“读取到第三个文件就报错”的现象。
具体修复步骤
- 第一步:统一导出端的编码,不要依赖pandas默认值。显式指定
utf-8-sig编码导出,这个编码既能适配Windows下Excel打开csv的乱码问题,也不会和读取端的逻辑冲突:
champSalaryData = pd.DataFrame(easy_dict) # 导出csv时显式指定编码 champSalaryData.to_csv( 'Champ_Salaries/' + champ + '-' + year +'.csv', index=False, encoding='utf-8-sig' )
- 第二步:修正读取逻辑,统一用匹配的编码读取,不要手动
open读csv文本:
import os import pandas as pd csv_folder_path = 'path' for filename in os.listdir(csv_folder_path): # 过滤非csv文件,避免读到系统隐藏文件 if not filename.endswith('.csv'): continue # 用os.path.join拼接路径,避免手写斜杠的路径错误 full_file_path = os.path.join(csv_folder_path, filename) # 用和导出端一致的编码读取csv team = pd.read_csv(full_file_path, encoding='utf-8-sig')
旧文件应急处理
如果已经生成的csv不想重新导出,可以在读取时把编码换成gb18030——这个编码是GBK的超集,能覆盖绝大多数Windows环境下默认导出csv的解码需求,碰到0x80这类非UTF-8字节时也不会触发报错:
team = pd.read_csv(full_file_path, encoding='gb18030')
内容的提问来源于stack exchange,提问作者JackB
相关产品推荐
相关产品推荐

