从文本文件中删除未知的字符

我有大量的文件包含我正在尝试使用Python脚本处理的数据。

这些文件是一个未知的编码,如果我在记事本++中打开它们,它们包含由加载的“空白”字符(在记事本++中黑色背景上的白色表示为NULL)分隔的数字数据。

为了处理这个问题,我用空字符\ x00分隔文件,并使用以下脚本检索数值:

stripped_data=[] for root,dirs,files in os.walk(PATH): for rawfile in files: (dirName, fileName)= os.path.split(rawfile) (fileBaseName, fileExtension)=os.path.splitext(fileName) h=open(os.path.join(root, rawfile),'r') line=h.read() for raw_value in line.split('\x00'): try: test=float(raw_value) stripped_data.append(raw_value.strip()) except ValueError: pass 

但是,在文件中有时候还有其他无法识别的字符(就我所知,总是在最开始的时候),这些在Notepad ++中显示为“EOT”,“SUB”和“ETX”。 它们似乎干扰了Python中文件的处理过程 – 即使在Notepad ++中可以看到更多的数据,文件也会以这些字符结尾。

在处理之前,如何从这些文件中删除所有非ASCII字符?

您正在文本模式下打开文件。 这意味着第一个Ctrl-Z字符被认为是文件结束符。 在open()中指定'rb'而不是'r'。

我不知道这是否会工作,但你可以尝试在codec模块中使用IO方法:

 import codec inFile = codec.open(<SAME ARGS AS 'OPEN'>, 'utf-8') for line in inFile.readline(): do_stuff() 

您可以像处理普通的FILE对象一样对待inFile

这可能或可能不会帮助你,但它可能会。

[编辑]

基本上你会用h=open(os.path.join(root, rawfile),'r', 'utf-8')替换: h=open(os.path.join(root, rawfile),'r') h=open(os.path.join(root, rawfile),'r', 'utf-8')

file.read()函数将读取,直到EOF。 正如你所说的那样,它停止得太早了,即使打EOF也要继续阅读文件。 确保在读完整个文件时停止。 你可以通过file.tell()在打EOF时检查文件中的位置,当你点击文件大小(在读取之前读取文件大小)停止。

由于这相当复杂,您可能需要使用file.next并遍历字节。

要删除非ASCII字符,可以使用特定字符的白名单,或者根据您定义的范围检查读取的字节。 例如,x30和x39之间的字节(数字) – >保存/保存在某处/将其添加到字符串。 看到一个ASCII表格 。