如何在 python 中遍历大型 CSV 文件时轻松使用内存?

Posted

技术标签:

【中文标题】如何在 python 中遍历大型 CSV 文件时轻松使用内存?【英文标题】:How to go easy on memory while iterating through a large CSV file in python? 【发布时间】:2016-12-26 17:41:47 【问题描述】:

我目前有一个包含 200k 行的 csv 文件,每行包含 80 个条目,以逗号分隔。我尝试使用 open() 打开 csv 文件并将数据附加到二维 python 列表中。当我尝试遍历该列表并将 80 个条目附加到单个条目时,计算机冻结。我的代码会产生某种内存问题吗?我应该批量处理我的数据还是有更有效的方法来完成我正在尝试做的事情?

简而言之:打开 csv,遍历 200k 条目并将它们从 [1, 2, 3, 4, 5,..., 80], [1, ..., 80 ], .... 200k -> [12345...80]。 [1...80], 200k

import csv


# create empty shells
raw_data = []
concatenate_data = []


def get_data():
    counter = 1

    # open the raw data file and put it into a list
    with open('raw_data_train.csv', 'r') as file:
        reader = csv.reader(file, dialect='excel')

        for row in reader:
            print('\rCurrent item: 0'.format(counter), end='', flush=True)
            raw_data.append(row)
            counter += 1

    print('\nReading done')


def format_data():
    counter = 1
    temp = ''

    # concatenate the separated letters for each string in the csv file
    for batch in raw_data:
        for letters in batch:
            temp += letters
        concatenate_data.append(temp)
        print('\rCurrent item: 0'.format(counter), end='', flush=True)
        counter += 1

    print('\nTransforming done')
    print(concatenate_data[0:10])

【问题讨论】:

temp只在启动时初始化正常吗? @Jean-FrançoisFabre 你所说的正常是什么意思?我只是暂时需要这个变量来保存 80 个单个条目并将它们转换为单个条目。这就是为什么它只包含在格式数据函数中。 【参考方案1】:

format_data() 例程必然会大量占用您的 CPU:

使用string 连接,与其他方法相比,这是次优的(StringIOstr.join) 在整个例程中使用相同的 temp 变量 在循环中附加temp(基本上附加一个越来越大的字符串)。

我想你只是想这样做:将所有文本附加为每行 1 个字符串,不带空格。使用str.join 可以更快地避免字符串连接:

for batch in raw_data:
    concatenate_data.append("".join(batch))

如果你能去掉指纹,甚至更快:

 concatenate_data = ["".join(batch) for batch in raw_data]

【讨论】:

我想出了这么多,因为一遍又一遍地附加相同的数据是没有意义的。 很抱歉,我完全忘记将临时变量设置回空字符串。目标是将 80 个单个字符串附加到一个大字符串中,并且对于所有 200k 条目。 你的意思是concatenate_data是一个串联的行列表,还是一个包含csv文件所有字符串的大字符串,flat? 我的意思是连接字符的列表。所以将 [[a, b, c, d, ....], [a, b, c, d, ...], ....[]] 改为 [abcd..., abdc... , abcd..., ...] 非常感谢。不知道 .join 比通常的连接要快得多。打印件仅用于调试:)

以上是关于如何在 python 中遍历大型 CSV 文件时轻松使用内存?的主要内容,如果未能解决你的问题,请参考以下文章

使用大型(1.7gig)csv 文件在 python 中清理数据

如何在python中对没有标题的大型csv信号文件进行分类?

如何逐行处理大型 CSV 文件?

我有一个大型 CSV 文件,其中包含单个列中的信息。如何使用 python 在 excel 中复制“文本到列”任务? [复制]

在python中迭代大型csv文件中的行的最佳方法,写入新的

Python中的大型csv文件[重复]