如何让csvreader的DictReader一次处理一行?

kcwpcxri  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(77)

我正在内存受限的环境中解压缩一个非常大的CSV文件。出于这个原因,我每次解压缩一行代码,如下所示:

with zipfile.ZipFile(temp_file.name) as zip_content:
    filename = zip_content.namelist()[0]
    with zip_content.open(filename, mode="r") as content:
        for line in content:
            print(line)

它将每一行都正确地生成一个字节数组。

b'name,age,city\n'
b'John,12,Madrid\n'
...

我想用csv.DictReader来处理这些行,这样我就可以可靠地访问每个字段。
然而,显然我不能在循环中为每一行创建一个新的dict阅读器。
我很想推出自己的解决方案,解析标题,然后为每行创建这些字典,但我想知道是否有一些快速的方法来利用DictReader
有什么方法可以避免先把整个文件阅读到内存中?

8yoxcaq7

8yoxcaq71#

with zip_content.open(filename, mode="r") as content:
    header = next(content).decode('utf-8').strip().split(',')

    for line in content:
        line_io = io.StringIO(line.decode('utf-8'))
        reader = csv.DictReader(line_io, fieldnames=header)

        for row in reader:
            print(row)

在这里,您每次只在内存中保存一行(加上头),因此对于大型CSV文件来说应该是有效的。

rfbsl7qr

rfbsl7qr2#

您可以使用io.TextIOWrapper Package 打开的zip条目,然后使用csv.DictReader逐行读取CSV文件。

from zipfile import ZipFile
import csv
from io import TextIOWrapper

file_name = "test.zip"
with ZipFile(file_name) as zipObj:
    for info in zipObj.infolist():
        with zipObj.open(info.filename, "r") as zd:
         reader = csv.DictReader(TextIOWrapper(zd, "utf-8"))
            for row in reader:
                print(row)

对于示例CSV输入,输出将是:

{'name': 'John', 'age': '12', 'city': 'Madrid'}

相关问题