2016-12-26 38 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文件所有字符串的大字符串,是扁平的嗎? –