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

Python 删除大文本文件中除ASCII可打印字符和中文字符以外的所有字符,python,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').re

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

首先,你真的确定这是正确的做法吗?我们经常看到人们试图用随机的想法来试探性地清理他们的数据,即如何清除积垢,而不是从源头上解决问题。是否有一种方法可以删除您在流程早期不需要的内容,或者至少向我们解释为什么您的数据包含您不希望包含的内容

当前方法的问题是,您没有充分的理由一次将整个文本文件加载到内存中。Python可能无法一次将所有2GB内存(加上它自己的代码和运行时状态所需的任何内存)都放在驻留内存中,因此操作系统将内存区域交换到磁盘,而只是重复地将它们重新交换回来

您最终是否需要将整个结果文本存储在内存中?如果没有,只需一次读写一行,然后将该内存用于下一行文本

打开(中文文件,'r',编码为='UTF-8')作为所有字符:
include=set(string.printable+all\u chi\u char.read())
将open(source_文件'r',encoding='UTF-8')作为输入,将open(dest_文件'w')作为输出:
对于inp中的行:
输出线=[]
对于ch in行:
如果包括:
行外追加(ch)
输出写入(“”.join(out_行))

这仍然可以通过使用
string.maketrans()
来改进,而不是使用自产的
字符集,但我猜这已经解决了性能问题。

我建议将行写入新文件,而不是在内存中累加完整的字符串。你调用变量
chi_char
,然后将其称为
all_chi_char
——我猜这些应该是同一个变量?谢谢,性能提高了很多。只需将最后一行更改为outp.write(''.join(out_-line)+'\n')。。。或者将换行符添加到要包含的字符(!)
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