批量读取多CSV文件时Pandas Read CSV解码错误求助
批量处理多用户CSV文件时的Unicode解码错误解决方法
问题背景
我有一批CSV文件,命名格式示例:2C-BEB-29-2009-01-18.csv、2C-BEB-29-2010-02-18.csv、2C-ISI-12-2010-01-01.csv,命名规则:
- 所有文件以
2C-开头 - 第二部分(如BEB)是记录设备名称
- 第三部分(如29、12)是用户ID
- 最后部分是记录日期
我有大约150个不同的用户ID,希望将单个用户的处理逻辑自动化,适配所有用户。
单个用户处理代码
针对单个用户(匹配模式2C-BEB-29-*.csv),我用以下代码读取文件:
def pd_read_pattern(pattern): files = glob.glob(pattern) df = pd.DataFrame() for f in files: csv_file = open(f) a = pd.read_csv(f,sep='\s+|;|,', engine='python') # 根据用户ID修改日期列 a['date'] = str(csv_file.name).rsplit('29-',1)[-1].rsplit('.',1)[0] # df = df.append(a) # df = df[df['hf']!=0] return df.reset_index(drop=True)
获取唯一用户匹配模式
为批量处理所有用户,我先提取所有唯一的用户匹配模式(格式如2C-BEB-29-*.csv):
import glob lst=[] for name in glob.glob('*.csv'): if len(name)>15: a = name.split('-',3)[0]+"-"+name.split('-',3)[1]+"-"+name.split('-',3)[2]+'-*' lst.append(a) lst = set(lst)
批量处理时的问题
执行以下批量读取代码时,pd.read_csv行出现Unicode解码错误:
for file in lst: # print(type(file)) files = glob.glob(file) # print(files) df = pd.DataFrame() for f in files: csv_file = open(f) # print(f, type(f)) a = pd.read_csv(f,sep='\s+|;|,', engine='python') # 根据用户ID修改日期列 # a['date'] = str(csv_file.name).rsplit(f.split('-',3)[2]+'-',1)[-1].rsplit('.',1)[0] # df = df.append(a) # df = df[df['hf']!=0] # return df.reset_index(drop=True)
解决Unicode解码错误
解码错误通常源于CSV文件使用了非默认字符编码(如utf-16、gbk、latin-1等),可通过以下方式解决:
1. 指定明确的编码格式
尝试常见编码格式,修改pd.read_csv的参数:
# 优先尝试utf-8,报错则换gbk或latin-1 a = pd.read_csv(f, sep='\s+|;|,', engine='python', encoding='utf-8') # 备选方案: # a = pd.read_csv(f, sep='\s+|;|,', engine='python', encoding='gbk') # a = pd.read_csv(f, sep='\s+|;|,', engine='python', encoding='latin-1') # 兼容所有字节,避免报错
2. 自动检测文件编码
使用chardet库自动检测文件编码,先安装依赖:
pip install chardet
然后修改读取逻辑:
import chardet for f in files: # 检测文件编码 with open(f, 'rb') as f_raw: encoding_result = chardet.detect(f_raw.read()) # 用检测到的编码读取文件 a = pd.read_csv(f, sep='\s+|;|,', engine='python', encoding=encoding_result['encoding'])
3. 编码错误兜底处理
若部分文件编码异常,可添加errors参数忽略或替换错误字符:
a = pd.read_csv(f, sep='\s+|;|,', engine='python', encoding='utf-8', errors='replace') # 或使用errors='ignore'直接忽略错误字符
代码优化建议
- 无需提前执行
csv_file = open(f),pd.read_csv会自行处理文件打开,可删除该行冗余代码 - 批量合并DataFrame时,使用
pd.concat替代已弃用的df.append,效率更高 - 提取日期时可简化字符串处理,无需依赖用户ID硬编码:
# 从文件名直接拆分提取日期 date_str = f.split('-')[-1].replace('.csv', '') a['date'] = date_str
内容的提问来源于stack exchange,提问作者dspractician
相关产品推荐
相关产品推荐

