Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中迭代一个大的CSV文件时,如何轻松使用内存?_Python_Csv - Fatal编程技术网

在python中迭代一个大的CSV文件时,如何轻松使用内存?

在python中迭代一个大的CSV文件时,如何轻松使用内存?,python,csv,Python,Csv,我目前有一个csv文件,有200k行,每行包括80个条目,用逗号分隔。我尝试用open()打开csv文件,并将数据附加到二维python列表中。当我尝试遍历该列表并将80个条目附加到单个条目时,计算机冻结。我的代码是否会产生某种内存问题?我应该分批处理我的数据,还是有更有效的方法来完成我的工作 简而言之:打开csv,浏览200k条目的内容,并将它们从[1,2,3,4,5,…,80],[1,…,80]。。。。200k->[12345…80]。[1…80],20万 import csv # cr

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

简而言之:打开csv,浏览200k条目的内容,并将它们从[1,2,3,4,5,…,80],[1,…,80]。。。。200k->[12345…80]。[1…80],20万

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])
format\u data()
例程一定会占用您的CPU很多时间:

  • 使用
    string
    串联,这是次优的,与其他方法不同(
    StringIO
    str.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]

temp
仅在开始时初始化是正常的吗?@Jean-FrançoisFabre你所说的正常是什么意思?我只需要这个变量暂时保存80个条目,并将它们转换为一个条目。这就是为什么它只包含在format data函数中。我明白了这一点,因为反复添加相同的数据毫无意义。很抱歉,我完全忘记了将temp变量设置回空字符串。我们的目标是将80个单个字符串附加到一个大字符串中,并对所有200k个条目进行附加。您的意思是
concatenate_data
是一个连接行列表,还是一个包含csv文件所有字符串的大字符串,flat?我是指连接字符列表。因此,将[a,b,c,d,…],[a,b,c,d,…],…[]更改为[abcd…,abdc…,abcd…,…]非常感谢。我不知道。连接比通常的连接要快得多。打印内容仅用于调试:)