我有一个很大的客户端 csv 文件,并通过 url 共享下载,我想逐行或按字节下载它,我只想限制 10 个条目。
我有以下代码将下载文件,但我想在这里只下载文件中的前 10 个条目,我不想要完整的文件。
#!/usr/bin/env python
import requests
from contextlib import closing
import csv
url = "https://example.com.au/catalog/food-catalog.csv"
with closing(requests.get(url, stream=True)) as r:
f = (line.decode('utf-8') for line in r.iter_lines())
reader = csv.reader(f, delimiter=',', quotechar='"')
for row in reader:
print(row)
Run Code Online (Sandbox Code Playgroud)
我不太了解contextlib,它将如何with在 Python 中使用。
任何人都可以在这里帮助我,这真的很有帮助,并提前致谢。
问题不在于contextlib发电机,而在于发电机。当你的with块结束时,连接将被关闭,相当简单。
实际执行下载的部分是一个惰性生成器for row in reader:,因为它reader被包裹起来。循环的每次迭代实际上都会从流中读取一行,可能会通过 Python 进行一些内部缓冲。f
关键是在 10 行后停止循环。有几种简单的方法可以做到这一点:
for count, row in enumerate(reader, start=1):
print(row)
if count == 10:
break
Run Code Online (Sandbox Code Playgroud)
或者
from itertools import islice
...
for row in islice(reader, 0, 10):
print(row)
Run Code Online (Sandbox Code Playgroud)