2010-11-25 93 views
2

我有大量包含数据的文件,我尝试使用Python脚本进行处理。从文本文件中删除未知字符

这些文件是未知的编码,如果我在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字符?

+2

如果这些文件在该未知编码中是正确的,那么您可能需要使用一些逻辑来尝试如果某种编码看起来合适,并阅读该编码中的文件。应该有一些库/示例代码在那里。 (就像Notepad ++以特定的编码方式打开它认为合适的文件。)如果这不是一个选项......请参阅下面的答案。 – Kissaki 2010-11-25 15:45:16

+0

我找不到任何适合的编码 - 认为这是一种奇怪的独特格式。 – meepmeep 2010-11-25 16:05:37

+0

如果你问了一个问题,以确定你的文件的布局和编码,你会帮助你很多...(1)文件的来源(什么网站,什么软件创建它们)(2)显示文件的前几个字节的内容...使用`print repr(open('afile.ext', 'rb')。read(200))` – 2010-11-25 18:28:00

回答

5

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

1

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

import codec 

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

可以治疗​​就像一个普通的文件对象。

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

[编辑]

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

+0

我假设应该读取h = codecs.open(os.path.join(root,rawfile),'r','utf-8') - 如果是,它会返回'编解码器无法解码位置8-10中的字节:无效数据' – meepmeep 2010-11-25 15:42:52

1

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

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

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