2015-11-05 166 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功能需要一个迭代的对象像列表