我正在使用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']
我需要做些什么才能看到实际的文字?
答案 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