在Python中,我想读取存储在zip文件中的巨大CSV文件,但一次只能读取固定大小的块

phi*_*nna 1 python csv zip

我正在处理一个 468 MB 的 zip 文件,其中包含一个文件,即 CSV 文本文件。我不想提取整个文本文件,因此我一次读取 zip 文件的一个二进制块。块大小约为 65536 字节。

我知道我可以使用 Python 的csvfile库读取该文件,但在这种情况下,我提供给它的块不一定会落在行边界上。

我怎样才能做到这一点?(ps,我不想使用Pandas

谢谢。

jua*_*aga 5

你只需要做类似的事情:

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.readercsv.DictReader对象一起使用。

默认情况下,这应该以合理大小的块读取它,可能无论是什么io.DEFAULT_BUFFER_SIZE,因为查看zipfile.ZipExtFile它继承自的源代码io.BufferedIOBase