簡體   English   中英

刪除大文本文件中除 ASCII 可打印字符和中文字符之外的所有字符

[英]Remove all characters except ASCII printable and chinese characters in large text file

我有一個 2GB 的文本文件,我想清理這個文件,使其只包含 ASCII 可打印字符和中文字符(大約 10000 個字符)。

我嘗試了下面的兩個代碼,但它們都非常慢。 如果有任何建議,不勝感激。

chi_char = open(chinese_file,'r',encoding='UTF-8').read()
include = set(string.printable+all_chi_char)

full_text = open(source_file,'r',encoding='UTF-8').read()
output_text = ''.join(ch for ch in full_text if ch in include)
chi_char = open(chinese_file,'r',encoding='UTF-8').read()
include = set(string.printable+all_chi_char)

full_text = open(source_file,'r',encoding='UTF-8').read()
output_text = ''
for ch in full_text:
    if ch in include:
        output_text += ch

首先,你真的確定這是正確的做法嗎? 很多時候,我們看到人們試圖用隨機的想法來啟發式地清理他們的數據,即如何去除多余的東西,而不是從源頭解決問題。 是否有辦法在流程早期刪除您不想要的內容,或者至少向我們解釋為什么您的數據包含您不希望它包含的內容?

您當前方法的問題在於,您無緣無故地將整個文本文件一次加載到內存中。 Python 可能無法一次在常駐內存中擁有所有 2GB(加上它自己的代碼和運行時狀態所需的任何內容),因此操作系統將內存區域換出到磁盤,只是再次將它們換回,重復。

您最終需要將整個結果文本保存在內存中嗎? 如果不是,則一次只讀寫一行,然后將該內存用於下一行文本。

with open(chinese_file,'r',encoding='UTF-8') as all_chi_char:
    include = set(string.printable+all_chi_char.read())

with open(source_file,'r',encoding='UTF-8') as inp, open(dest_file, 'w') as outp:
    for line in inp:
        out_line = []
        for ch in line:
            if ch in include:
                out_line.append(ch)
        outp.write(''.join(out_line))

這仍然可以通過使用string.maketrans()而不是本地字符set來改進,但我猜這已經解決了性能問題。

暫無
暫無

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

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