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

时间:2010-11-25 15:32:10

标签: python windows character-encoding

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

文件采用未知编码,如果我在Notepad ++中打开它们,它们包含由加载的“null”字符分隔的数字数据(在Notepad ++中黑色背景上用白色表示为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字符?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

我不知道这是否可行,但您可以尝试使用codec模块中的IO方法:

import codec

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

您可以将inFile视为普通的FILE对象。

这可能会或可能不会对您有所帮助,但可能会有所帮助。

<强> [编辑]

基本上,您将h=open(os.path.join(root, rawfile),'r')替换为h=open(os.path.join(root, rawfile),'r', 'utf-8')

答案 2 :(得分:1)

file.read()功能将一直读到EOF。 正如你所说,它太早停止你想要继续阅读文件,即使在击中EOF时。 确保在阅读完整个文件后停止。您可以通过在点击EOF时通过file.tell()检查文件中的位置并在达到文件大小时停止(在读取之前读取文件大小)来执行此操作。

由于这相当复杂,您可能希望使用file.next并迭代字节。

要删除非ascii字符,您可以使用特定字符的白名单,也可以针对您定义的范围检查读取字节。 例如。是x30和x39之间的字节(数字) - &gt;保持/保存在某处/将其添加到字符串中。 请参阅ASCII table