2016-12-26 84 views
3

我目前有一个200k行的csv文件,每行包括80个条目,用逗号分隔。我尝试用open()打开csv文件并将数据追加到2-D python列表中。当我尝试遍历该列表并将80个条目添加到单个列表中时,计算机会冻结。我的代码是否会产生某种内存问题?我应该分批处理数据吗?还是有更有效的方法来解决我想要做的事情?如何在python中遍历大型CSV文件时轻松实现内存?

简而言之:打开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]) 
+0

是正常的'temp'只在启动时进行更快的使用str.join避免字符串连接呢? –

+0

@ Jean-FrançoisFabre你是什么意思?我只需要暂时使用这个变量来保存80个单个条目并将它们转换为单个条目。这就是为什么它只包含在格式数据函数中。 – d3x

回答

1

format_data()例程势必生猪您的CPU很多:使用string级联这是次优的,而不是其它的方法(StringIO

  • str.join
  • 使用相同temp变量在整个例程中
  • 在循环中追加temp(基本上追加一个更大和更大的字符串)。

我想你只是想做到这一点:追加所有的文本为每行1个字符串,没有空格。

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

甚至更​​快,如果你能摆脱打印:

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

我想出了很多,因为它反复追加相同的数据是没有意义的。 –

+0

我很抱歉,我完全忘了将temp变量设置回空字符串。目标是将80个单个字符串添加到一个大的字符串中,并且对所有200k个字符添加。 – d3x

+0

你的意思是'concatenate_data'是一个连接线的列表,或者是一个包含csv文件所有字符串的大字符串,是扁平的吗? –