我正在处理一个 468 MB 的 zip 文件,其中包含一个文件,即 CSV 文本文件。我不想提取整个文本文件,因此我一次读取 zip 文件的一个二进制块。块大小约为 65536 字节。
我知道我可以使用 Python 的csvfile库读取该文件,但在这种情况下,我提供给它的块不一定会落在行边界上。
我怎样才能做到这一点?(ps,我不想使用Pandas)
谢谢。
你只需要做类似的事情:
import zipfile
import io
import csv
with zipfile.ZipFile("test.zip") as zipf:
with zipf.open("test.csv", "r") as f:
reader = csv.reader(
io.TextIOWrapper(f, newline='')
)
for row in reader:
do_something(row)
Run Code Online (Sandbox Code Playgroud)
假设您有一个 zip 存档,例如:
import zipfile
import io
import csv
with zipfile.ZipFile("test.zip") as zipf:
with zipf.open("test.csv", "r") as f:
reader = csv.reader(
io.TextIOWrapper(f, newline='')
)
for row in reader:
do_something(row)
Run Code Online (Sandbox Code Playgroud)
请注意,zipf.open返回一个二进制流,因此您可以使用 anio.TextIOWrapper使其成为文本流,它可以与任何csv.reader或csv.DictReader对象一起使用。
默认情况下,这应该以合理大小的块读取它,可能无论是什么io.DEFAULT_BUFFER_SIZE,因为查看zipfile.ZipExtFile它继承自的源代码io.BufferedIOBase。