2014-02-14 84 views
0

儘管屬於同一列,但我有一個CSV文件,每行都包含大量數據點。一些與此類似:閱讀和格式化CSV文件(新行插入)

A, B, C, X, Y, Z 

現在,我想要做的是重新格式化文件,使得所得CSV是:

A, B, C 
X, Y, Z 

我不太知道如何去討論這個/用pythonic的方式來表達它。一個想法(我不知道如何編寫代碼)是類似的循環創建於

For elements in file: 
    new_csv = [] 
    counter = 0 
    max_counter = 3 

    ##I'm using english because I dont know how to express it in python syntax 
    take first element in CSV and add 1 to counter 
    append first element to new_csv 
    is counter < max_counter? 
     if yes: go to next element 
     if no: append /n to new csv then go to next element 

這可能是做一個可怕的方式,但我在努力尋找另一種方式。我將如何在python語法中表達這一點?有任何想法嗎?

+0

你是說你想把六個元素分成兩個三行元素? – raser

+0

對,然後我想把它寫到一個新的csv – user2179795

+0

好了,那麼你可以將你的CSV行格式化爲代碼嗎?現在兩條線都在同一行 – raser

回答

3

只要寫兩行輸出csv.writer() object

with open(inputfilename, 'rb') as infh, open(outputfilename, 'wb') as outfh: 
    reader = csv.reader(infh) 
    writer = csv.writer(outfh) 

    for row in reader: 
     writer.writerows([row[:3], row[3:]]) 

每個csv.reader()對象產生行是一個列表對象,所以我們必須使用Python slice notation做切片的一個新的列表對象前3個元素,另外3個元素的列表對象。

+0

我真的不確定用於編寫csv的''wb''。文檔中沒有使用這個例子,我認爲你在這種情況下會丟失編碼設施。這意味着你一直操縱字節(並且只能工作,因爲你也用'rb'來讀取,或者你得到了'TypeError:'str'不支持緩衝區接口') – Cilyan

+0

@Cilyan:Python 2建議你使用'rb'以便CSV讀取器和寫入器對象完全控制行尾。爲了達到同樣的目的,Python 3使用'newline ='''。所以這裏的Python版本的建議有所不同。 –

+0

@Cilyan:由於Python 2仍然被大多數人使用,我堅持這一點;您可能會注意到'csv.writer'文檔鏈接轉到Python 2文檔。 –

1

你也許可以使用Python的CSV module

例子:

#!/usr/bin/env python 
import csv 

with open("input.csv", "r") as input_file, open("output.csv", "w+"): 
    input_csv, output_csv = csv.reader(input_file), csv.writer(output_file); 
    for row in input_csv: 
     output_csv.writerows([row[:len(row)/2],row[len(row)/2]]); 

其中給出的輸入

a,b,c,d,e,f 
A,B,C,D,E,F,G 
1,2,3,4,5,6 

將輸出

a,b,c 
d,e,f 
A,B,C 
D,E,F,G 
1,2,3 
4,5,6 
+0

我認爲這裏有幾個錯別字(缺少第二次打開的目標,缺少冒號。) – DSM

+0

啊,射擊,我怎麼想的? fix'd謝謝:) – raser

0

此解決方案適用於Python 3.對於Python 2,請參閱Martijn Pieters's answer(文件打開方式不同)。

Python有一個模塊到readwrite csv文件。有關如何使用它們的官方文檔中有一些nice examples。 (注意newline=""輸出文件,這讓csv模塊照顧的線返回,其中根據說明書中應該是\r\n\n被用於換行中的單元格。)

在閱讀,則再拆與slicing行並饋送在作家的部分。

import csv 

# with ensures files are closed when leaving block 
with open("in.csv", "r") as fin, open("out.csv", "w", newline="") as fout: 
    reader = csv.reader(fin, delimiter=",") 
    writer =csv.writer(fout, delimiter=",", quotechar='"', quoting=csv.QUOTE_MINIMAL) 
    # Rows are each line of the csv returned as a list 
    for row in reader: 
     # Separate the row: 
     # from beginning to 3rd element, and from 3rd element to end 
     writer.writerows((row[:3], row[3:])