2016-06-01 2 views
0

Я пытаюсь выполнить очистку данных с помощью python. У меня есть некоторые большие файлы (1 - 2gigs) csv, которые я хочу сортировать по некоторому атрибуту (например, дата, время), а затем выводят еще один файл csv с этой информацией с целью сделать его пригодным для использования в excel.очистка данных в python с использованием больших (1.7gig) файлов csv

Поскольку я повторяю строки, я сталкиваюсь с некоторыми проблемами с большой памятью. Первоначально я использовал 32-разрядный Idle, который не запускал мой код, а затем переключился на 64-bit Spyder. Теперь код запускается, но останавливается (как представляется, обрабатывается, память потребляется, но не видели, чтобы она двигалась в последние полчаса) на первой итеративной строке.

Мой код выглядит следующим образом. Процесс останавливается на строке 10 (выделено). Я довольно новичок в python, поэтому я уверен, что мой код очень примитивен, но это лучшее, что я могу сделать! Спасибо за вашу помощь заранее :)

def file_reader(filename): 
    "function takes string of file name and returns a list of lists" 
    global master_list 
    with open(filename, 'rt') as csvfile: 
     rows = [] 
     master_list = [] 
     rowreader = csv.reader(csvfile, delimiter=',', quotechar='|') 
     **for row in rowreader:** 
      rows.append(','.join(row)) 

     for i in rows: 
      master_list.append(i.replace(' ', '').replace('/2013', ',').split(",")) 

     return master_list 

def trip_dateroute(date,route): 
    dateroute_list = [] 
    for i in master_list: 
     if str(i[1]) == date and str(i[3]) == route: 
      dateroute_list.append(i) 
    return dateroute_list 

def output_csv(filename, listname): 
    with open(filename, "w") as csvfile: 
     writer = csv.writer(csvfile, delimiter=',', quotechar='|', lineterminator='\n') 
     for i in listname: 
      writer.writerow(i)   

ответ

0

Если вам не нужно держать все содержимое файла в памяти, вы можете просто обработать каждую строку и сразу же записать его в выходной файл. Кроме того, в вашем примере вы анализируете CSV и затем генерируете CSV снова, но вы, похоже, не используете анализируемые данные. Если это верно, то вы можете просто сделать это:

def file_converter(infilename, outfilename): 
    with open(infilename, 'rt') as infile, open(outfilename, "w") as outfile: 
     for line in infile: 
      line.replace(' ', '').replace('/2013', ',') 
      outfile.write(line) 

Если функция trip_dateroute() используется для фильтрации строк, которые фактически должны быть написаны, вы можете добавить, что тоже, но тогда вам на самом деле нужно parse CSV:

def filter_row(row, date, route): 
    return str(row[1]) == date and str(row[3]) == route 

def cleanup(field): 
    return field.replace(' ', '').replace('/2013', ',') 

def file_converter(infilename, outfilename, date, route): 
    with open(infilename, 'rt') as infile, open(outfilename, "w") as outfile: 
     reader = csv.reader(infile, delimiter=',', quotechar='|') 
     writer = csv.writer(outfile, delimiter=',', quotechar='|', lineterminator='\n') 
     for row in reader: 
      row = [cleanup(field) for field in row if filter_row(row, date, route)] 
      writer.writerow(row) 
Смежные вопросы