簡體   English   中英

Python:從巨大的csv文件中刪除重復項(內存問題)

[英]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)。

  1. 打開您的csv文件以進行閱讀。
  2. 逐行讀取,如果尚未在該用戶的ID中找到用戶ID,則將其追加到final_list 如果找到,請檢查current_data的年份以及final_list數據。 如果當前數據具有較新的條目,則只需在final_list更改用戶的日期以及與之關聯的顏色即可。
  3. 只有這樣,當您的final_list完成后,您final_list編寫新的csv文件。

如果您希望此任務更快,則希望...

  • 優化循環。
  • 使用標准的python函數和/或用C編碼的庫。

如果仍然不夠優化,請學習C。在C中讀取csv文件,使用分隔符對其進行解析,然后遍歷數組並不困難,即使在C中也是如此。

我看到兩種明顯的解決方法,它們不涉及在內存中保留大量數據:

  1. 使用數據庫而不是CSV文件
  2. 重新整理您的CSV文件以方便排序。

使用數據庫非常簡單。 我希望您甚至可以使用Python附帶的SQLite。 我認為這將是我的首選。 為了獲得最佳性能,請創建(人,日期)的索引。

第二個步驟是讓CSV文件的第一列為人員ID,第二列為日期。 然后,您可以從命令行對CSV文件進行排序,即對myfile.csv進行排序。 這會將特定人的所有條目歸為一組,並且如果您的日期格式正確(例如YYYY-MM-DD),則感興趣的條目將是最后一個條目。 Unix sort命令以其速度而聞名,但是它非常健壯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM