2015-11-05 6 views
1

У меня небольшая проблема. Я пытаюсь создать сценарий, который принимает большие (~ 2gb) csv-файлы (id, integer, integer), сортирует их по первому целому, а затем записывает в новый файл, верхние строки x (как определено пользователем).Python - модуль CSV для записи определенных строк в новый файл

Я могу получить функцию сортировки для работы по мере необходимости, а также извлечь верхние строки X, но я не могу решить, как получить этот вывод для записи в csv. Чтобы проверить, что он работает, я включил функцию печати, и все это, похоже, отлично работает.

Я чувствую, что у меня отсутствует базовая концепция в модуле csv, но я не могу понять, что это такое!

import csv 
import operator 

def csv_to_list(csv_file, delimiter=','): 

    with open(csv_file, 'r') as csv_con: 
     reader = csv.reader(csv_con, delimiter=delimiter) 
     return list(reader) 

def sort_by_column(csv_cont, col, reverse=True): 

    header = csv_cont[1] 
    body = csv_cont[1:] 
    if isinstance(col, str): 
     col_index = header.index(col) 
    else: 
     col_index = col 
    body = sorted(body, 
      key=operator.itemgetter(col_index), 
      reverse=reverse) 
    #body.insert(0, header) 
    return body 

def print_csv(csv_content): 
    for row in csv_content: 
     row = [str(e) for e in row] 
     print('\t'.join(row)) 

def write_csv(dest, csv_cont): 
    with open(dest, 'w') as out_file: 
     writer = csv.writer(out_file, delimiter=',') 
     for row in csv_cont: 
      writer.writerow(row) 

csv_cont = csv_to_list(input_hep.csv) 
row_count = sum(1 for row in csv_cont) 
num_rows = int(input("Skim size?: ")) 
output_file = input("Output: ") 

csv_sorted = sort_by_column(csv_cont, 1) 
for row in range(num_rows): 
    print(csv_sorted[row]) 

Моя основная идея состояла в том, чтобы попробовать:

with open(output_file+'.csv','w') as f: 
    writer = csv.writer(f, delimiter =',') 
    for row in range(num_rows): 
     writer.writerow(row) 

Но тогда я получаю "_csv.Error: итерацию ожидается, не Int" ошибка. Я понимаю, почему, но я изо всех сил пытаюсь понять, как я могу получить вывод (как он напечатан) для записи внутри csv. Любые советы или указатели будут оценены.

ответ

1

Если массив является многомерным списком, вы можете использовать writerows непосредственно без перебора

with open(output_file+'.csv','w') as f: 
    writer = csv.writer(f, delimiter =',') 
    writer.writerows(sorted_csv_cont) 

Предположим, что ваш список находится в следующем формате

[ 
    ["R1_C1","R1_C2"], 
    ["R2_C1","R2_C2"] 
] 
0

Я просто написать CSV, как этот

hs = open(filepath,"w+") 
for mline in rows: 
    hs.write(",".join(mline)+"\r") 

но загрузите CSV в качестве многомерного списка с каждой строки, представляющей собой строку в CSV и эти списки, имеющие элементы, которые представляют элемент в строке

функция
0

Writerow нужен Iterable объект как список