使用gen分块读取CSV文件

2024-10-02 02:41:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大的csv文件,我需要处理,它是这样做的(非常简化):

import csv
from csv import excel

def _get_dialect():
    class CustomDialect(excel):
        delimiter = ','
    return CustomDialect()

class DictIter:
    def __init__(self):
        self.reader = csv.DictReader(open('test.csv'), 
                                     fieldnames=['col1', 'col2'], 
                                     dialect=_get_dialect())

    def __iter__(self):
        return self

    def __next__(self):
        return self.reader.__next__()

items = DictIter()
for item in items:
    print(item)

有更好的方法来做,但这就是我现在所拥有的。 现在,我想把处理分成块,找到一个简单的解决方案,它应该对我有用:

^{pr2}$

不过,我缺乏一些生成器知识,无法将这两段代码组合在一起。基本上我想要这样的东西:

import csv
from csv import excel

def gen_chunks(reader, chunksize=500):
    chunk = []
    for i, line in enumerate(reader):
        if (i % chunksize == 0 and i > 0):
            yield chunk
            del chunk[:]
        chunk.append(line)
    yield chunk

def _get_dialect():
    class CustomDialect(excel):
        delimiter = ','
    return CustomDialect()

class DictIter:
    def __init__(self):
        self.reader = csv.DictReader(open('test.csv'), 
                                     fieldnames=['col1', 'col2'], 
                                     dialect=_get_dialect())

    def __iter__(self):
        return self

    def __next__(self):
        for chunk in gen_chunks(self.reader):
            for item in chunk:
                yield item

items = DictIter()
for item in items:
    print(item)

这可能有点笨拙,但我希望在对当前结构进行最小更改的情况下实现拆分处理。我试图实现的是让当前实现保留迭代器类,但一次处理一个块,并在完成前一个块后生成下一个块。在


Tags: csvinimportselfforgetreturndef
1条回答
网友
1楼 · 发布于 2024-10-02 02:41:53

您的解决方案看起来过于复杂:

import csv

with open('test.csv',newline='') as f:
    reader = csv.DictReader(f,fieldnames=['col1', 'col2'])
    for item in reader:
        print(item)

你的分块仍然一次返回一个项目。excel方言的默认分隔符是逗号,excel是默认方言。在

注意newline=''是打开传递给csv读写器对象的文件的方法。在

如果你真的有理由分块(多处理?)你应该说明这一点,如果不成功的话,你应该展示一下。在

相关问题 更多 >

    热门问题