python檔案去重 python實現檔案內容去重

2021-10-11 09:52:12 字數 1753 閱讀 9761

python 實現檔案內容去重

有的文字檔案很大,超出了編譯器能讀取的範圍

能有**解決的**解決,寫好**可以在其他**中呼叫,更方便使用

簡單的可以分為兩種情況小檔案和大檔案,先來看小檔案去重實現。如同把大象關冰箱一樣分三步:

第一步,讀取檔案每一行,並處理掉換行符

第二步,將檔案內容去重

第三步,寫到新檔案裡(把冰箱門關上)

上**def file_remove_same(input_file, output_file):

針對小檔案去重

:param input_file: 輸入檔案

:param out_file: 去重後出檔案

:return:

with open(input_file, 'r', encoding='utf8') as f, open(output_file, 'a', encoding='utf8') as ff:

data = [item.strip() for item in f.readlines()] # 針對最後一行沒有換行符,與其他它行重複的情況

new_data = list(set(data))

ff.writelines([item + '\n' for item in new_data if item]) # 針對去除檔案中有多行空行的情況

對於大檔案幾十個g那種(更大的也別放在本地了,放資料庫)就不能載入到記憶體中了,強行載入到記憶體中直接報記憶體錯誤

解決方案是:將檔案按行讀取,根據內容生成乙個指紋(md5值或者其他唯一可識別的值),將指紋存集合中,當逐行讀取的過程中判斷集合中是否已經含有該行元素的指紋。如果指紋沒有新增到集合中,則新增指紋到集合中並將此行追加輸出到輸出檔案中。如果指紋已經在集合中了,說明此行與上面的某一行重複。

def gen_md5(data):

生成md5

:param data: 字串資料

:return:

md5 = hashlib.md5()

md5.update(data.encode('utf-8'))

return md5.hexdigest()

def big_file_remove_same(input_file, output_file):

針對大檔案檔案去重(將檔案檔案寫在一行的,沒有辦法去重)

:param input_file:

:param output_file:

:return:

finger_print_set = set()

with open(input_file, 'r', encoding='utf8') as f, open(output_file, 'w', encoding='utf8') as ff:

for line in f:

line_string = line.strip()

finger_print = gen_md5(line_string)

if finger_print not in finger_print_set:

finger_print_set.add(finger_print)

ff.write(line)

這樣解決大小檔案去重的問題

還有一種極端情況,就是指紋集合非常大,將記憶體占用溢位。這種情況幾乎不會遇到,做乙個大致的估計:當這個指紋集合記憶體占用到3g的時候,按照集合的占用效率大致是67%算,就能容納2g的指紋,指紋按照md5值計算,就能容納6710萬行資料 。如果檔案超過6710萬行可以考慮採用資料庫(redis)方案。資料庫方案有空再補充吧

python 多表去重 Python列表去重

無聊統計了下列表去重到底有多少種方法。1.集合 list set alist 如果要保持順序 import random if name main a random.randint 0,10 for i in xrange 10 b list set a b.sort key a.index 2.字...

Python之檔案自動去重

小擼了把python,這個果然是世界上最好用的語言 md5訊息摘要演算法 英語 md5 message digest algorithm 一種被廣泛使用的密碼雜湊函式,可以產生出乙個128位 16位元組 的雜湊值 hash value 用於確保資訊傳輸完整一致。md5由美國密碼學家羅納德 李維斯特 ...

python中df去重 python去重函式是什麼

資料去重可以使用duplicated 和drop duplicates 兩個方法。dataframe.duplicated subset none,keep first 返回boolean series表示重複行 引數 subset 列標籤或標籤序列,可選 僅考慮用於標識重複項的某些列,預設情況下使...