使用Pandas/Dask导入CSV/Excel时遇编码错误与空格转码异常
问题解决方法
一、CSV导入的Unicode解码错误
出现的错误:
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 6892: character maps to
试这几种办法:
- 换
utf-8编码,同时加上错误处理参数避免崩溃:# Pandas names_csv = pd.read_csv('file_name.csv', encoding='utf-8', errors='replace') # Dask names_csv_dd = dd.read_csv('file_name.csv', encoding='utf-8', errors='replace') - 用
latin-1编码,它能兼容所有字节,不会触发解码错误:names_csv = pd.read_csv('file_name.csv', encoding='latin-1') names_csv_dd = dd.read_csv('file_name.csv', encoding='latin-1') - 先检测文件真实编码(需要先装chardet:
pip install chardet):import chardet with open('file_name.csv', 'rb') as f: file_encoding = chardet.detect(f.read())['encoding'] # 用检测出的编码导入 names_csv = pd.read_csv('file_name.csv', encoding=file_encoding) names_csv_dd = dd.read_csv('file_name.csv', encoding=file_encoding)
二、Excel导入后空格变_x0020_的处理
这是XML转义的空格字符,直接替换即可:
- 只处理列名:
names_excel.columns = names_excel.columns.str.replace('_x0020_', ' ') - 列名和内容一起处理:
names_excel = names_excel.replace('_x0020_', ' ', regex=True) names_excel.columns = names_excel.columns.str.replace('_x0020_', ' ') - Dask的处理方式,把清理逻辑放到延迟读取函数里:
def clean_excel_df(file_path): df = pd.read_excel(file_path) df.columns = df.columns.str.replace('_x0020_', ' ') df = df.replace('_x0020_', ' ', regex=True) return df parts = dask.delayed(clean_excel_df)("file_name.xlsx") df = dd.from_delayed(parts)
内容的提问来源于stack exchange,提问作者Afonso Garcia
相关产品推荐
相关产品推荐

