[英]Python: Removing duplicates from a huge csv file (memory issues)
我有一個很大的csv文件,其中包含許多不同的人。 其中一些人兩次出現。 像這樣:
Name,Colour,Date
John,Red,2017
Dave,Blue,2017
Tom,Blue,2017
Amy,Green,2017
John,Red,2016
Dave,Green,2016
Tom,Blue,2016
John,Green,2015
Dave,Green,2015
Tom,Blue,2015
Rebecca,Blue,2015
我想要一個僅包含每個人最新顏色的csv文件。 例如,對於John,Dave,Tom和Amy,我只對2017年的行感興趣。對於Rebecca,我將需要2015年的值。
csv文件很大,包含超過1000萬條記錄(所有人都有唯一的ID,因此重復的名稱無關緊要)。 我已經嘗試了以下方法:
Open csv file
Read line 1.
If person is not in "seen" list, add to csv file 2
Add person to "Seen" list.
Read line 2...
問題是“可見”列表變得龐大,我的內存不足。 另一個問題是有時日期不正確,因此舊條目會進入“可見”列表,然后新條目不會覆蓋它。 如果可以按降序對數據進行排序,這將很容易解決,但是我正努力按照文件的大小對數據進行排序。
有什么建議么?
如果整個csv文件可以存儲在類似以下的列表中:
csv_as_list = [
(unique_id, color, year),
…
]
那么您可以按以下sort
對該列表進行sort
:
import operator
# first sort by year descending
csv_as_list.sort(key=operator.itemgetter(2), reverse=True)
# then, since the Python sort is stable, by unique_id
csv_as_list.sort(key=operator.itemgetter(0))
然后您可以:
from __future__ import print_function
import operator, itertools
for unique_id, group in itertools.groupby(csv_as_list, operator.itemgetter(0)):
latest_color = next(group)[1]
print(unique_id, latest_color)
(我只是在這里使用print
,但是您的要點是。)
如果無法將csv文件作為列表加載到內存中,則必須執行一個使用磁盤的中間步驟(例如SQLite)。
final_list
。 如果找到,請檢查current_data
的年份以及final_list
數據。 如果當前數據具有較新的條目,則只需在final_list
更改用戶的日期以及與之關聯的顏色即可。 final_list
完成后,您final_list
編寫新的csv文件。 如果您希望此任務更快,則希望...
如果仍然不夠優化,請學習C。在C中讀取csv文件,使用分隔符對其進行解析,然后遍歷數組並不困難,即使在C中也是如此。
我看到兩種明顯的解決方法,它們不涉及在內存中保留大量數據:
使用數據庫非常簡單。 我希望您甚至可以使用Python附帶的SQLite。 我認為這將是我的首選。 為了獲得最佳性能,請創建(人,日期)的索引。
第二個步驟是讓CSV文件的第一列為人員ID,第二列為日期。 然后,您可以從命令行對CSV文件進行排序,即對myfile.csv進行排序。 這會將特定人的所有條目歸為一組,並且如果您的日期格式正確(例如YYYY-MM-DD),則感興趣的條目將是最后一個條目。 Unix sort命令以其速度而聞名,但是它非常健壯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.