Python3读取Zip压缩包内CSV文件报错,求解决方法
Python 3中读取压缩包内CSV文件的报错解决
嘿,这个问题我太熟了!你遇到的ParserError其实是Python 3和Python 2在文件IO处理上的核心差异导致的,别慌,我给你拆解清楚并解决掉~
问题到底出在哪?
在Python 2里,zipfile.ZipFile.open()返回的是文本模式的文件对象,pandas的read_csv()可以直接处理这种对象输出的字符串内容。但到了Python 3,这个方法默认返回的是二进制模式的文件对象——它输出的是bytes类型数据,而read_csv()明确期望的是字符串类型的输入,这就直接触发了那个报错。
两种快速修复方案
方案一:打开文件时直接指定文本模式
最简单的方式就是在调用zippedyear.open()时,加上mode='r'参数(明确指定文本读取模式),同时指定CSV文件对应的编码(比如常用的utf-8):
import pandas as pd import zipfile with zipfile.ZipFile('myarchive.zip', 'r') as zippedyear: for filename in ['myfile1.csv', 'myfile2.csv', 'myfile3.csv']: # 明确指定文本模式和编码 mydf = pd.read_csv(zippedyear.open(filename, mode='r', encoding='utf-8'))
方案二:用io.TextIOWrapper包装二进制流
如果你的Python版本稍旧,或者需要更灵活的编码处理逻辑,可以用io模块的TextIOWrapper把二进制文件对象转换成文本模式的对象:
import pandas as pd import zipfile import io with zipfile.ZipFile('myarchive.zip', 'r') as zippedyear: for filename in ['myfile1.csv', 'myfile2.csv', 'myfile3.csv']: # 将二进制流包装为文本流 text_file = io.TextIOWrapper(zippedyear.open(filename), encoding='utf-8') mydf = pd.read_csv(text_file)
小提示
- 一定要匹配CSV文件的实际编码!如果你的文件是GBK编码的,就把
encoding改成gbk,不然可能会出现乱码问题。 - Python 3对文本和二进制数据做了严格区分,这是为了避免Python 2里隐式转换带来的各种混乱,虽然一开始有点不适应,但确实是更规范的设计哦~
内容的提问来源于stack exchange,提问作者鈩暿樖樶竼岣结笜
相关产品推荐
相关产品推荐

