在不将文件写入磁盘的情况下将 csv 数据转换为 dict
convert csv data to dict without writing file to disk
这是我的场景:我有一个 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 对象工作的情况下完成此操作。
dict_list = [] # a list
reader = csv.DictReader(open('yourfile.csv', 'rb'))
for line in reader: # since we used DictReader, each line will be saved as a dictionary
dict_list.append(line)
DictReader
需要一个文件或 file-like 对象:我们可以通过将压缩文件加载到 io.StringIO
实例中来满足此期望。
请注意,StringIO
期望其参数为 str
,但从压缩文件 returns bytes
读取文件,因此必须对数据进行解码。此示例假定 csv 最初是使用本地系统的默认编码进行编码的。如果不是这种情况,则必须将正确的编码传递给 decode()
.
for name in myzipfile.namelist():
data = myzipfile.open(name).read().decode()
mycsv = io.StringIO(data)
reader = csv.DictReader(mycsv)
for row in reader:
print(row)
这是我的场景:我有一个 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 对象工作的情况下完成此操作。
dict_list = [] # a list
reader = csv.DictReader(open('yourfile.csv', 'rb'))
for line in reader: # since we used DictReader, each line will be saved as a dictionary
dict_list.append(line)
DictReader
需要一个文件或 file-like 对象:我们可以通过将压缩文件加载到 io.StringIO
实例中来满足此期望。
请注意,StringIO
期望其参数为 str
,但从压缩文件 returns bytes
读取文件,因此必须对数据进行解码。此示例假定 csv 最初是使用本地系统的默认编码进行编码的。如果不是这种情况,则必须将正确的编码传递给 decode()
.
for name in myzipfile.namelist():
data = myzipfile.open(name).read().decode()
mycsv = io.StringIO(data)
reader = csv.DictReader(mycsv)
for row in reader:
print(row)