如何将chunksize函数实现为csv读取代码

时间:2019-05-08 14:23:44

标签: python csv chunks

我有一个将csv文件读入列表和字典的代码。现在,我想“改进”我的代码以获取比我的RAM可以存储的更大的csv文件。 我查找了几个选项,找到了以下条目以及csv模块(How do you split reading a large csv file into evenly-sized chunks in Python?)的解决方案:

import csv
reader = csv.reader(open('4956984.csv', 'rb'))

def gen_chunks(reader, chunksize=100):
    """ 
    Chunk generator. Take a CSV `reader` and yield
    `chunksize` sized slices. 
    """
    chunk = []
    for i, line in enumerate(reader):
        if (i % chunksize == 0 and i > 0):
            yield chunk
            del chunk[:]
        chunk.append(line)
    yield chunk

for chunk in gen_chunks(reader):
    print chunk # process chunk

我试图将代码实现到我的代码中,但是似乎代码没有将处理分成多个块。 这是我的先前代码:

ids = {}
corpus = []

with open(csv_file, newline='') as csvfile:
    reader = csv.reader(csvfile, delimiter=';', quotechar='|') 
    documente = next(reader, None)[1:]
    for rownumber, row in enumerate(reader): 
        for index, field in enumerate(row):
            if index == 0:
                if rownumber > 0:
                    ids[rownumber-1] = field 
            else:
                if rownumber == 0:
                    corpus.append([])
                else:
                    try:
                        corpus[index-1].append((rownumber-1, int(field)))
                    except ValueError:
                        corpus[index-1].append((rownumber-1, 0))

这是我用chunksize-modification修改的代码:

ids = {}
corpus = []

csvfile = open(dateiname_TDM, newline='')
reader = csv.reader(csvfile, delimiter=';', quotechar='|') 

def gen_chunks(reader, chunksize=100):
    """ 
    Chunk generator. Take a CSV `reader` and yield
    `chunksize` sized slices. 
    """
    chunk = []
    for i, line in enumerate(reader):
        if (i % chunksize == 0 and i > 0):
            yield chunk
            del chunk[:]
        chunk.append(line)
    yield chunk

for chunk in gen_chunks(reader):
    for rownumber, row in enumerate(reader): 
        for index, field in enumerate(row):
            if index == 0:
                if rownumber > 0:
                    ids[rownumber-1] = field 
            else:
                if rownumber == 0:
                    corpus.append([])
                else:
                    try:
                        corpus[index-1].append((rownumber-1, int(field)))
                    except ValueError:
                        corpus[index-1].append((rownumber-1, 0))

我认为我不能仅将小数部分实现到我的代码中,但是我不知道如何以另一种方式实现它。

有人可以帮我解决这个问题吗?

CSV文件是术语文档矩阵。第一行的意思是列出的所有文档,第一列的意思是列出的所有术语。在单元格中是文档列表集中某个术语的术语频率。我需要将语料库文件作为使用Gensim进行主题建模的输入。它必须是以下形式:

[[(i, j), (i+1, k),...], [...], [...]]

语料库文件具有文档数量的长度,并且在每个元组中都是从0开始到最后一个的术语的索引(i)j是文档i中术语corpus[x]的术语频率。

也许一次处理每个文档然后合并?

0 个答案:

没有答案