2014-10-31 61 views
1

我有一个包含数百行的CSV文件,我希望选择和导出每3行到一个新的CSV文件,新的输出CSV文件以第一排的选择。如何使用python选择CSV文件中的每第N行

例如在下面的CSV文件....

1980 10 12    
1 2 3 4 5 6 7  
4 6 8 1 0 8 6 
1981 10 12 
2 4 9 7 5 4 1 
8 9 3 8 3 7 3 

我想选择第3行和导出到一个名为“1980年10月12日”基于第一行新的CSV然后选择接下来的3行并基于接下来的3行的第一行导出到名为“1981 10 12”的新CSV。我想用python来做这个。

+0

请显示您尝试解决问题并尝试解释为什么它不起作用。 – wwii 2014-10-31 17:39:47

+0

CSV的格式为','作为分隔符吗? – rickcnagy 2014-10-31 17:39:48

+0

是由两个空格分隔吗??? – Hackaholic 2014-10-31 17:43:37

回答

1

使用csv module,加上itertools.islice()每次选择3行:

import csv 
import os.path 
from itertools import islice 


with open(inputfilename, 'rb') as infh: 
    reader = csv.reader(infh) 
    for row in reader: 
     filename = row[0].replace(' ', '_') + '.csv') 
     filename = os.path.join(directory, filename) 
     with open(filename, 'wb') as outfh: 
      writer = csv.writer(outfh) 
      writer.writerow(row) 
      writer.writerows(islice(reader, 2)) 

writer.writerows(islice(reader, 2))线需要在接下来的2行从读者,传达给作家CSV复制它们,写当前行后(与日期)首先到输出文件。

您可能需要调整csv.reader()csv.writer()对象的参数delimiter;默认值是一个逗号,但是您没有指定确切的格式,您可能需要将其设置为'\t'选项卡。

如果您正在使用Python 3,打开与'r''w'文本模式下的文件,并设置newline=''两种; open(inputfilename, 'r', newline='')open(filename, 'w', newline='')

+1

祝贺300k Martijn! :) – Doobeh 2014-10-31 17:46:33

+0

@MartijnPieters,该代码工程很好,除了我的输出CSV文件只包含第一行的第一列。例如,对于第一组数据,当我希望将第一组数据命名为“19801012.csv”时,我的输出文件是“1980.csv”,第二组数据是“1981.csv”第一行的3列。我将如何去改变这一点?非常感谢帮忙。 – KoolKid 2014-11-03 16:42:22

+0

@KoolKid:如果日期分散在3列,只需将它们结合在一起; 'filename =''.join(row [:3] +'.csv''会将前3列加入到一个字符串中并附加'.csv'扩展名。 – 2014-11-03 16:44:34

0
import csv 
with open("in.csv") as f: 
    reader = csv.reader(f) 
    chunks = [] 
    for ind, row in enumerate(reader, 1): 
     chunks.append(row) 
     if ind % 3 == 0: # if we have three new rows, create a file using the first row as the name 
      with open("{}.csv".format(chunks[0][0].strip(), "w") as f1: 
       wr = csv.writer(f1) 
       wr.writerows(chunks) # write all rows 
      chunks = [] # reset chunks to an empty list 
+0

为什么单独的计数器可以使用'enumerate()'而不是? – 2014-10-31 17:46:52

+0

@MartijnPieters,我如何重置枚举为0? – 2014-10-31 17:48:30

+0

您可以使用'%'模数运算符。 – 2014-10-31 17:49:51

0

使用轻微的挂羊头卖狗肉的迭代器:

with open('in.csv', 'r') as infh: 
    for block in zip(*[infh]*3): 
     filename = block[0].strip() + '.csv' 
     with open(filename, 'w') as outfh: 
      outfh.writelines(block) 

Python的2.X你会使用itertools.izipdocs实际上提到izip(*[iter(s)]*n)作为聚类数据系列的一个成语。

相关问题