下面是我的场景:我有一个zip文件,我正在用requests
下载到内存中,而不是写一个文件。我正在将数据解压缩到一个名为myzipfile
的对象中。zip文件中有一个csv文件。我想把每一行csv数据转换成一个字典。这是我到目前为止所拥有的
import csv
from io import BytesIO
import requests
# other imports etc.
r = requests.get(url=fileurl, headers=headers, stream=True)
filebytes = BytesIO(r.content)
myzipfile = zipfile.ZipFile(filebytes)
for name in myzipfile.namelist():
mycsv = myzipfile.open(name).read()
for row in csv.DictReader(mycsv): # it fails here.
print(row)
错误:
Traceback (most recent call last):
File "/usr/lib64/python3.7/csv.py", line 98, in fieldnames
self._fieldnames = next(self.reader)
_csv.Error: iterator should return strings, not int (did you open the file in text mode?)
看起来csv.DictReader(mycsv)
需要一个文件对象而不是原始数据。如何将mycsv
对象数据(<class 'bytes'>)
中的行转换为字典列表?我试图在不将文件写入磁盘和直接从内存中的csv对象工作的情况下实现这一点
DictReader
需要一个文件或类似文件的对象:我们可以通过将压缩后的文件加载到io.StringIO
实例中来满足这个期望请注意
StringIO
期望其参数为str
,但从zipfile读取文件返回bytes
,因此必须对数据进行解码。本例假设csv最初是使用本地系统的默认编码进行编码的。如果不是这样,则必须将正确的编码传递给decode()
相关问题 更多 >
编程相关推荐