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

时间:2019-07-17 03:44:55

标签: python

我有一个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

1 个答案:

答案 0 :(得分:1)

首先,您真的确定这是正确的做法吗?我们经常看到人们尝试通过随机想法启发式清理数据,而不是从源头解决问题。

>也许有一种方法可以删除您在此过程的早期不需要的东西,或者至少向我们解释为什么您的数据包含您不希望包含的东西?

当前方法的问题是,没有充分的理由立即将整个文本文件加载到内存中。 Python可能无法一次在驻留内存中拥有全部2GB(加上其自己的代码和运行时状态所需的任何内容),因此OS会将内存区域换出到磁盘上,而只能反复地将它们换回来。

您最终是否需要将整个结果文本存储在内存中?如果不是这样,只需一次读写一行,然后将该内存重新用于下一行文本即可。

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字符来改善此问题,但我想这已经可以解决性能问题。

相关问题