代码之家  ›  专栏  ›  技术社区  ›  meepmeep

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

  •  2
  • meepmeep  · 技术社区  · 15 年前

    我有大量文件,其中包含我正试图使用Python脚本处理的数据。

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

    为了处理这个问题,我用空字符\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
    

    但是,文件中有时还有其他无法识别的字符(据我所知,总是在最开始的时候)——这些字符在记事本++中显示为“EOT”、“SUB”和“ETX”。它们似乎干扰了Python中文件的处理——文件似乎以这些字符结尾,尽管在Notepad++中显然可以看到更多的数据。

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

    3 回复  |  直到 15 年前
        1
  •  5
  •   Martin v. Löwis    15 年前

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

        2
  •  1
  •   Chris Pfohl    15 年前

    我不知道这样做是否可行,但您可以尝试使用 codec 模块:

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

    你可以治疗 inFile 就像普通的文件对象一样。

    这可能对你有帮助,也可能没有,但可能会。

    [编辑]

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

        3
  •  1
  •   Kissaki    15 年前

    这个 file.read() 函数将一直读取到EOF。 正如您所说,停止得太早了,您希望继续读取文件,即使是在命中EOF时。 当你读完整个文件时,一定要停止。您可以通过以下方式检查文件中的位置 file.tell() 当你点击一个EOF,当你点击一个文件大小(读取前读取文件大小)时停止。

    由于这很复杂,您可能需要使用 file.next 并在字节上迭代。

    要删除非ascii字符,可以对特定字符使用白名单,也可以根据定义的范围检查读取字节。 例如,是介于x30和x39之间的字节(一个数字)->将其保留/保存到某个位置/将其添加到字符串中。 看到一个 ASCII table .