2012-03-27 82 views
1

我老老實實地在這上面花了很多時間,並且它正在慢慢地殺死我。我從PDF中剝離了內容並將其存儲在一個數組中。現在我試圖將其從數組中拉出並寫入一個txt文件。但是,由於編碼問題,我似乎無法做到這一點。Python編碼用於寫入文本文件的解碼

allTheNTMs.append(contentRaw[s1:].encode("utf-8")) 
for a in range(len(allTheNTMs)): 
     kmlDescription = allTheNTMs[a] 
     print kmlDescription #this prints out fine 
     outputFile.write(kmlDescription) 

我得到的錯誤是「的UnicodeDecodeError:ASCII編碼解碼器不能在213位解碼字節爲0xC2:序數不在範圍內(128)

我只是瞎搞了,但我已經試過各種方法讓這些東西寫出來。

outputFile.write(kmlDescription).decode('utf-8')   

請原諒我,如果這是基本的,我還在學習的Python(2.7)。

乾杯!

EDIT1:樣本數據看起來像下面這樣:

Chart 3686 (plan, Morehead City) [ previous update 4997/11 ] NAD83 DATUM 
Insert the accompanying block, showing amendments to coastline, 
depths and dolphins, centred on: 34° 41´·19N., 76° 40´·43W. 
Delete R 34° 43´·16N., 76° 41´·64W. 

當我添加打印類型(原始),我得到

編輯2:當我嘗試寫數據時,我收到原始的錯誤消息(ASCII編碼解碼器不能解碼字節...)

我將檢查建議的螺紋和視頻。謝謝你們!

編輯3:我使用Python 2.7

編輯4:AGF擊中頭部釘在下面的意見時,他(她)注意到我是雙編碼。我試圖雙重編碼一個以前一直在工作的字符串,併產生了最初拋出的相同錯誤信息。喜歡的東西:

text = "Here's a string, but imagine it has some weird symbols and whatnot in it - apparently latin-1" 
textEncoded = text.encode('utf-8') 
textEncodedX2 = textEncoded.encode('utf-8') 
outputfile.write(textEncoded) #Works! 
outputfile.write(textEncodedX2) #failed 

一旦我想通了,我是想雙編碼時,溶液呈如下:

allTheNTMs.append(contentRaw[s1:].encode("utf-8")) 
for a in range(len(allTheNTMs)): 
    kmlDescription = allTheNTMs[a] 
    kmlDescriptionDecode = kmlDescription.decode("latin-1") 
    outputFile.write(kmlDescriptionDecode) 

它的工作了,我肯定感謝所有您的幫助!

+2

請提供一些樣品數據,你有問題。並運行「type(raw_data)」並將結果粘貼到您的問題中 – pylover 2012-03-27 19:45:35

+1

如果您只是嘗試「寫入」contentRaw,會發生什麼情況?它看起來像數據已經編碼。 – agf 2012-03-27 19:51:59

+0

我使用'codecs'模塊解決了一些相同的問題,特別是'codecs.open()'和'codecs.write()'。值得一看。 – heltonbiker 2012-03-27 19:59:44

回答

1

你的錯誤消息似乎並沒有出現涉及到任何你的Python語法,但實際上事實你試圖解碼其中有UTF-8沒有等效十六進制值。爲0xC2出現

HEX表示一個拉丁字符 - 在頂部重音的大寫字母A。因此,與其使用「allTheNTMs.append(contentRaw [S1:]編碼(」 UTF-8 「))」,嘗試: -

allTheNTMs.append(contentRaw[s1:].encode("latin-1")) 

我不是在Python所以這可能專家不工作,但它會顯示你正在嘗試編碼拉丁字符。鑑於您也收到了錯誤消息,看起來當嘗試​​使用UTF-8進行編碼時,Python只會查看前128個條目,因爲您的錯誤似乎表明條目「0Xc2」超出了範圍,實際上它是在UTF-8的前128個條目中。

+1

UTF-8可以代表任何unicode代碼點,所以問題是他試圖對數據進行雙重編碼,而不是目標編碼是什麼。 – agf 2012-03-27 20:04:32

+0

這是不正確的。他正在調用**'.encode' **方法並得到一個Unicode **解碼**錯誤。這意味着python2的隱式str/unicode轉換正在進行。 – Daenyth 2012-03-27 20:29:03

4

我的猜測是,你已經打開的輸出文件已被打開與latin1甚至utf-8編解碼器,因此你不能因爲它試圖重新轉換它utf-8編碼的數據寫入到,否則到正常打開的文件,你可以寫任何任意數據串,這裏是一個例子重新創建類似的錯誤

u = u'सच्चिदानन्द हीरानन्द वात्स्यायन ' 
s = u.encode('utf-8') 
f = codecs.open('del.text', 'wb',encoding='latin1') 
f.write(s) 

輸出:

Traceback (most recent call last): 
    File "/usr/lib/wingide4.1/src/debug/tserver/_sandbox.py", line 1, in <module> 
    # Used internally for debug sandbox under external interpreter 
    File "/usr/lib/python2.7/codecs.py", line 691, in write 
    return self.writer.write(data) 
    File "/usr/lib/python2.7/codecs.py", line 351, in write 
    data, consumed = self.encode(object, self.errors) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128) 

這將工作,如果你沒有設置任何編解碼器

f = open('del.txt', 'wb') 
f.write(s) 

另一種選擇是直接寫不連同編碼unicode字符串到文件中,如果OUTPUTFILE已經開通使用正確的編解碼器例如

f = codecs.open('del.text', 'wb',encoding='utf-8') 
f.write(u) 
+0

謝謝 - 我試過這只是爲了得到錯誤「typeerror:編碼是一個無效的關鍵字參數爲這個函數)」。看起來像用Python 3開始的編碼打開,我使用2.7。我應該詳細說明,並編輯我的問題。 – gruvn 2012-03-28 19:28:08

+0

@gruvn我正在使用Python 2.7,你正在傳遞的編碼函數?使用codecs.open – 2012-03-28 20:10:43

+0

哦,廢話 - 對不起阿努拉格 - 我是想: F =開放( 'del.text', 'WB',編碼= 'UTF-8')的 代替 F = codecs.open( 'del.text','wb',encoding ='utf-8') 我會再看一次。 PS:抱歉格式化,我無法使代碼標籤正常工作! – gruvn 2012-03-29 11:20:30