Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将csv数据转换为dict,而无需将文件写入磁盘_Python_Csv_Unzip - Fatal编程技术网

Python 将csv数据转换为dict,而无需将文件写入磁盘

Python 将csv数据转换为dict,而无需将文件写入磁盘,python,csv,unzip,Python,Csv,Unzip,下面是我的场景:我有一个zip文件,我正在将它与请求一起下载到内存中,而不是写入文件。我正在将数据解压缩到一个名为myzipfile的对象中。zip文件中有一个csv文件。我想把每一行csv数据转换成一个字典。这是我到目前为止所拥有的 import csv from io import BytesIO import requests # other imports etc. r = requests.get(url=fileurl, headers=headers, str

下面是我的场景:我有一个zip文件,我正在将它与请求一起下载到内存中,而不是写入文件。我正在将数据解压缩到一个名为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.DictReadermycsv需要一个文件对象而不是原始数据。如何将mycsv对象数据中的行转换为字典列表?我试图在不将文件写入磁盘和直接从内存中的csv对象工作的情况下实现这一点。

DictReader需要一个文件或类似文件的对象:我们可以通过将压缩文件加载到io.StringIO实例来满足这一期望

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)
请注意,StringIO希望其参数为str,但从zipfile读取文件会返回字节,因此必须对数据进行解码。本例假设csv最初是使用本地系统的默认编码进行编码的。如果不是这样,则必须传递正确的编码进行解码

DictReader需要一个文件或类似文件的对象:我们可以通过将压缩后的文件加载到io.StringIO实例中来满足这个期望

请注意,StringIO希望其参数为str,但从zipfile读取文件会返回字节,因此必须对数据进行解码。本例假设csv最初是使用本地系统的默认编码进行编码的。如果不是这样,则必须传递正确的编码进行解码


它不是只有csv.DictReadermyzipfile.openname吗?它不是只有csv.DictReadermyzipfile.openname吗?尝试在不将文件写入磁盘的情况下执行此操作。可能吗?我相信您也在读取代码中的文件,这与我在这里所做的相同。尝试在不将文件写入磁盘的情况下执行此操作。可能吗?我相信你也在阅读代码中的文件,这和我在这里做的是一样的。
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)