2010-11-25 94 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