python3 大檔案去重

jkdgvse發表於2020-10-17

一、生成待去重資料

每行是固定位數的數字串

import os
from random import randint

#-- from u_工具 import *


print("———— 開始 ————")
#-- 打點()

# 用來配置的變數
位數 = 13
行數 = 500 * 10000

輸出目錄 = "./a_輸入"
輸出檔案 = f"{輸出目錄}/隨機數.txt"


# 預處理
_00 = "".join(["0" for i in range(位數 - 1)])
_100 = "1" + _00
最小值 = int(_100)
_1000 = _100 + "0"
最大值 = int(_1000)

if not os.path.exists(輸出目錄):
    os.makedirs(輸出目錄)
#-- 輸出檔案 = 檔名防重_追加數字(輸出檔案)


# 實際處理
with open(輸出檔案,"a") as f:
    for i in range(行數):

        f.write(f"{randint(最小值, 最大值)}\n")

        百分比 = (i+1) / 行數 * 100
        if 百分比 == int(百分比):
            print(f"已完成{int(百分比)}%")


#-- 打點()
#-- print(f"\n總耗時:{計時(0)}")
print("———— 結束 ————")

 

 

二、通過set()按行去重

1. 按原值比較

(1)讀取全部資料

(2)用正規表示式來分行

(3)通過set資料結構來去除重複資料

(4)將set的資料寫入檔案

import os
import re

#-- from u_工具 import *


print("———— 開始 ————")
#-- 打點()

# 用來配置的變數
輸入目錄 = "./a_輸入"
輸出目錄 = "./b_輸出"
輸出檔案 = f"{輸出目錄}/去重結果.txt"


# 預處理
# 目錄不存在就手動建立
if not os.path.exists(輸出目錄):
    os.makedirs(輸出目錄)
if not os.path.exists(輸入目錄):
    os.makedirs(輸入目錄)  
#-- 輸出檔案 = 檔名防重_追加數字(輸出檔案)

# 獲取待去重檔案
待去重檔案列表 = []
待去重檔案列表 = [f"{輸入目錄}/{i}" for i in os.listdir(輸入目錄)]
#-- getDeepFilePaths(待去重檔案列表,輸入目錄,"txt")
print(f"\n總共{len(待去重檔案列表)}個檔案")


# 實際處理
all_lines = []
檔案個數 = 0
for 檔案 in 待去重檔案列表:
    檔案個數 += 1
    print(f"\n處理第{檔案個數}個檔案")

    #-- 打點()
    # (1)讀全部
    with open(檔案) as f:
        data = f.read()

    # (2)正則分行
    regx = '''[\w\~`\!\@\#\$\%\^\&\*\(\)\_\-\+\=\[\]\{\}\:\;\,\.\/\<\>\?]+'''
    lines = re.findall(regx, data)
    all_lines.extend(lines)
    #-- 打點()
    #-- print(f"讀取完畢,耗時:{計時()}")


# (3)集合去重
all_lines_set = set(all_lines)
#-- 打點()
#-- print(f"\n\n去重完畢,耗時:{計時()}")

# (4)迴圈寫入
with open(輸出檔案,"a") as f_rst:
    for line in all_lines_set:
        f_rst.write(line + '\n')
#-- 打點()
#-- print(f"\n寫入完畢,耗時:{計時()}")


#-- 打點()
#-- print(f"\n\n總耗時:{計時(0)}")
print("———— 結束 ————")

相關文章