2016-11-15 173 views
1

我試圖將幾行csv數據合併到一個長行中,因爲兩個單元格包含相同的數據。例如,採取以下CSV:Python csv:合併具有相同字段的行

one, two, three 
1, 2, 3 
4, 5, 6 
7, 8, 9 
1, 1, 1 
4, 4, 4 

如果兩排在行共享相同的值[0],我想在第二行附加到第一個。所以我的最終產品應該是這樣的:

one, two, three 
1, 2, 3, 1, 1, 1 
4, 5, 6, 4, 4, 4 
7, 8, 9 

這是迄今爲止我嘗試:

import csv 

uniqueNum = [] 
uniqueMaster = [] 
count = -1 
with open("Test.csv", "rb") as source: 
    reader = csv.reader(source) 
    header = next(reader) 
    for row in reader: 
     if row[0] not in uniqueNum: 
      uniqueMaster.append(row) 
      uniqueNum.append(row[0]) 
      count = count + 1 
      for row in reader: 
       if row[0] in uniqueNum: 
        uniqueMaster[count].append(row) 

with open("holding.csv","wb") as result: 
    writer = csv.writer(result) 
    writer.writerow(header) 
    for row in uniqueMaster: 
     writer.writerow(row) 

事情看起來好給我,但我的腳本只輸出如下:

one, two, three 
1, 2, 3, ['1', '1', '1'] 

這顯然是錯誤的,原因有兩個。首先,它不會遍歷整個csv,其次,附加值被壓縮到一個單元格中,而不是單個單元格中。如果任何人有任何建議讓這個工作正確,我會非常感激!

回答

2

請改用字典。從你的代碼的中間開始(假設我已經聲明瞭一個名爲字典my_dict):

for row in reader: 
    if row[0] in my_dict.keys(): 
     my_dict[row[0]].extend(row) 
    else: 
     my_dict[row[0]]=row 
    #...now we are at the bottom of your code, writing to the csv 
for v in my_dict.values(): 
    writer.writerow(v) 
+0

感謝您的答覆。這幾乎是這樣 - 行落入正確的位置,但它們的格式不正確。例如,第一個鍵/值對是:'{'1':['1','2','3',['1','1','1']]}'像這樣:'{'1':['1','2','3','1','1','1']}'。有關修復這最後一部分的任何建議? – bumble

+0

修正了它。它應該使用extend()而不是append()。有關更多信息,請參閱此[post](http://stackoverflow.com/questions/252703/append-vs-extend)。具體來說,亞倫廳給出了一個很好的解釋,包括運行時間。 –

+0

如果這項工作,請接受答案 –

1
import csv 

csv_dict = {} 

with open("Test.csv", "r") as source: 
    reader = csv.reader(source) 
    header = next(reader) 

    for row in reader: 
     if row[0] in csv_dict: 
      csv_dict[row[0]] += row 
     else: 
      csv_dict[row[0]] = row