2011-10-07 162 views
5

我有一個CSV具有多個條目的文件。例如CSV:的Python:刪除重複項CSV

user, phone, email 
joe, 123, [email protected] 
mary, 456, [email protected] 
ed, 123, [email protected] 

我想然而,隨着下面的代碼,我得到一個「列表索引超出範圍」由CSV特定列,以便移除重複。我想通過比較row[1]newrows[1]我會找到所有重複,只改寫file2.csv獨特的條目。這雖然不起作用,我不明白爲什麼。

f1 = csv.reader(open('file1.csv', 'rb')) 
    newrows = [] 
    for row in f1: 
     if row[1] not in newrows[1]: 
      newrows.append(row) 
    writer = csv.writer(open("file2.csv", "wb")) 
    writer.writerows(newrows) 

我的最終結果是有維護文件的順序列表(set將無法​​正常工作,對吧?),它應該是這樣的:

user, phone, email 
joe, 123, [email protected] 
mary, 456, [email protected] 
+0

我覺得一個數據庫將是非常有用的在這裏。 Python用SQLite處理OOB,你知道嗎? – NullUserException

+0

當某些事情不起作用時,您需要始終描述發生了什麼。這是一個錯誤嗎?這是什麼?這是錯誤的嗎? –

+0

我做了...我的代碼當前產生一個超出範圍的列表索引。這是沒有意義的,因爲它正在用行[1]搜索第二個「列」。 – serk

回答

8

row[1]指當前行(電話)的第二列。這一切都很好。

但是,你newrows.append(row)整行添加到列表中。

當您檢查row[1] in newrows你檢查,對完整的行的列表中的各個電話號碼。但那不是你想要做的。您需要檢查一個或一組電話號碼。爲此,您可能需要跟蹤行和一組觀察到的電話號碼。

喜歡的東西:

f1 = csv.reader(open('file1.csv', 'rb')) 
writer = csv.writer(open("file2.csv", "wb")) 
phone_numbers = set() 
for row in f1: 
    if row[1] not in phone_numbers: 
     writer.writerow(row) 
     phone_numbers.add(row[1]) 
+0

這工作。謝謝!我以爲'set'不會工作,因爲它不會保持輸出的順序正確。如果我使用'newrows'列表並且只是將'append(row)'修改爲'writerow',這仍然可以嗎? – serk

+0

@serk,集合起作用,因爲我從不關心訂單。我只檢查是否有東西在裏面。是的,追加到列表將工作得很好。 –

+1

通過,如果你是說一個telemarking數據庫INFACT刪除重複的電話號碼的方式,你有潛力真正消瘦您的通話清單的方式。有時,稍後在閱讀器文件中的電話號碼將是**更新的**和更準確的電話號碼,然後是與之前在閱讀器文件中遇到的相同的電話號碼,因爲它們被及時寫入文件時間片然後在閱讀器文件中稍後使用相同的電話號碼。 – DevPlayer