2016-12-23 20 views
0

我有一個文本文件的任務,並讓它被Python讀取爲一個非常長的字符串。也就是說,它不像csv或tsv,文本文件根本沒有表格結構,只是一堆文字。然而,該文本文件包含逗號和引號以及這種性質的東西,所以我得到解析問題。同時讀取原始文本文件和小節標點符號

我曾嘗試:

with open('text_file.txt') as f: 
    text_data = f.read().translate(string.punctuation) 

這導致讀取錯誤:「字符映射」編解碼器不能在47位解碼字節0x9d:字符映射爲「未定義」

我不知道該錯誤是否是.txt文件中標點符號干擾解析過程的結果,或者是否有一些奇怪的非Unicode字符無法讀取。可能,我可能需要一個對這兩個問題都很有效的解決方案。

如果您覺得有更好的方法比我的同步閱讀/剝離標點方法來實現我的目標,請隨時提出替代方案。

+1

這可能與打印Unicode字符到終端:http://stackoverflow.com/questions/14284269/why-doesnt-python-recognize-my-utf-8-encoded-source-file –

+0

是否有任何方法或論據可以傳遞給解析過程,只是丟棄一個不認識的字符?這樣我就不必爲任何我碰巧掌握的任務設置特定的字符集。我在想'with'處理程序實際上並沒有在終端中放置任何文本,但我可能是錯的。 –

+1

你知道文本文件的編碼嗎?如果它的utf-8,它可能就像'open('text_file.txt',encoding ='utf-8')'一樣簡單。 – tdelaney

回答

1

看起來你的文件是編碼的,但沒有一種標準的方法來檢測編碼,所以一些猜測工作是必需的。有各種模塊和工具可以幫助我,並且我已經包含一個名爲chardet的模塊來爲我完成這項工作。

對於您如何使用str.translate也存在問題。它需要一個翻譯表(通常使用str.ma ketrans構建) - 您的技術不會刪除標點符號。使用正則表達式查找單詞並從中重新生成字符串可能會更好。

from chardet.universaldetector import UniversalDetector 
import re 

detector = UniversalDetector() 
with open('text_file.txt', 'rb') as f: 
    for line in f: 
     detector.feed(line) 
     if detector.done: 
      break 
detector.close() 

with open('text_file.txt', encoding=detector.result['encoding']) as f: 
    text = ' '.join(re.findall(r'\w+', f.read()) 
+0

非常好,這讓我對所有事情都變得可行。 –