2014-10-31 86 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)作爲聚類數據系列的一個成語。

相關問題