读取URL压缩CSV至Pandas DataFrame时遇UnicodeDecodeError求助
解决读取压缩CSV到Pandas时的UnicodeDecodeError问题
错误提示UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 56说明你尝试用utf-8编码读取的CSV文件实际不是utf-8格式,而且你之前修改open()的encoding参数无效——因为保存zip文件用的是二进制模式(wb),该参数对二进制写入没有作用,错误出在pd.read_csv()读取解压后的CSV环节。
以下是具体解决方案:
方案1:指定正确编码读取CSV
常见的非utf-8编码有latin-1、gbk、cp1252等,可逐个尝试:
# 尝试latin-1(兼容所有字节,不会报错) df = pd.read_csv('data.csv', encoding='latin-1') # 针对中文文件尝试gbk df = pd.read_csv('data.csv', encoding='gbk') # Windows环境常见编码cp1252 df = pd.read_csv('data.csv', encoding='cp1252')
若不确定编码,可用chardet库检测:
import chardet with open('data.csv', 'rb') as f: result = chardet.detect(f.read(1000)) # 读取前1000字节检测编码 print(result['encoding']) # 输出检测结果,将其作为read_csv的encoding参数
方案2:内存中直接处理(更高效)
无需将zip和CSV保存到本地,直接在内存中解压读取,节省磁盘空间且避免文件残留:
import pandas as pd from urllib.request import urlopen import zipfile from io import BytesIO url = 'https://www.../data.zip' with urlopen(url) as response: zip_data = BytesIO(response.read()) with zipfile.ZipFile(zip_data) as zf: with zf.open('data.csv') as csv_file: # 替换为检测到的正确编码 df = pd.read_csv(csv_file, encoding='latin-1') df.head()
额外说明
- 若尝试多种编码仍报错,可通过
zf.infolist()查看zip内文件信息,确认文件是否为纯文本CSV(比如是否是伪装成csv的xlsx或仍处于压缩状态)。 - 临时应急可使用
encoding_errors='ignore'跳过错误字节(不推荐,会丢失数据):df = pd.read_csv('data.csv', encoding_errors='ignore')
内容的提问来源于stack exchange,提问作者JohnnyDevv
相关产品推荐
相关产品推荐

