Python从API加载CSV文件并在内存中迭代它

时间:2017-03-16 17:20:16

标签: python csv python-requests

我正在使用python中的requests库来命中一个应该返回CSV文件的API端点。在API的文档中,他们给出了如何获取文件的示例。

requestDownload = requests.request("GET", requestDownloadUrl, headers=headers, stream=True)
# with open("RequestFile.zip", "w") as f:
for chunk in requestDownload.iter_lines(chunk_size=1024):
      f.write(chunk)
zipfile.ZipFile("RequestFile.zip").extractall("MyDownload")

我不想把文件写成zip或其他任何东西。我只想迭代每一行。我尝试过以下内容,但它返回二进制而不是文本。

from contextlib import closing
import csv
import requests  

     with closing(
         requests.get(
             'api_URL/csvfile',
             stream=True,
         )
     ) as r:
         reader = csv.reader(
            (line.replace('\0','') for line in r.iter_lines()),
            delimiter=',',
            quotechar='"'
        )

        for row in reader:
        # Handle each row here...
            print row

打印row的结果是以下一堆:

['\x13\xa4\xa3\xedr\xae\xe6\x0b\x9b\x08\x9c\xabX\xda\xa3d%\\+\xcd\xd5\xfat\x13\xf3']
['51W\x91o\xe2\xef(\x19\x18\xa9\xe2}\xe2\xbca\xd4]\x93\x1d@8:\x8d\xab\xa0\x08\xe6\xd4\xc7\xc5\xcdb\xaf\x8d\xf6\xa2\x8d~s\xb5\xea?\x04\x1c\xfb\xc5\xed9\x
8c']

我需要做些什么才能看到实际的文字?

1 个答案:

答案 0 :(得分:0)

您可以使用io模块将url读入类似文件的对象,然后使用它来创建内存中的zipfile。在这个例子中,我没有使用流式传输,因为整个zipfile需要在内存中从中提取。在创建zipfile的位置,内存中存在多个数据副本,这些副本在大文件上可能会有问题。您可能会构建一个包含resp.iter_content的类文件对象,但这个示例有点多。

from contextlib import closing
import requests
import zipfile
import io
import csv


with closing(requests.get("http://localhost:8000/test.zip")) as resp:
    incore_zip = zipfile.ZipFile(io.BytesIO(resp.content))
try:
    with incore_zip.open('test.csv') as fp:
        reader = csv.reader(io.TextIOWrapper(fp, encoding="utf-8"))
        for row in reader:
            print(row)
finally:
    del incore_zip