2016-11-15 68 views
1

我目前對我的python 3代碼有問題。Python:UnicodeDecodeError:'ascii'編解碼器無法解碼位置0的字節0xef:序號不在範圍內(128)

replace_line('Products.txt', line, tenminus_str) 

是我想轉成UTF-8行,但是當我嘗試像我會跟別人,我得到的錯誤要做到這一點,如無屬性的人,當我嘗試添加,爲例如...

.decode("utf8") 

...到它的結尾,我仍然得到它使用ascii的錯誤。我還嘗試了其他方法,如添加io等其他方法。盈方和添加具有

encoding = 'utf8' 

一個逗號,我使用replace_line的功能:

def replace_line(file_name, line_num, text): 
    lines = open(file_name, 'r').readlines() 
    lines[line_num] = text 
    out = open(file_name, 'w') 
    out.writelines(lines) 
    out.close() 

我將如何解決這個問題?請注意,我對Python非常陌生,不夠先進,無法很好地進行調試。

編輯:不同修復這個問題不是「重複」

編輯2:我有另一個錯誤與現在的功能。

File "FILELOCATION", line 45, in refill replace_line('Products.txt', str(line), tenminus_str) 

File "FILELOCATION", line 6, in replace_line lines[line_num] = text 

TypeError: list indices must be integers, not str 

這是什麼意思,我該如何解決?

+0

向我們展示您的stracktrace,向我們顯示您的數據 – Falmarri

+0

這是什麼意思? –

+0

使用utf_8_sig,而不是utf8,你的文件可能以bom開頭 – YOU

回答

4

codecs模塊正是您所需要的。 detail這裏

import codecs 
def replace_line(file_name, line_num, text): 
    f = codecs.open(file_name, 'r', encoding='utf-8') 
    lines = f.readlines() 
    lines[line_num] = text 
    f.close() 
    w = codecs.open(file_name, 'w', encoding='utf-8') 
    w.writelines(lines) 
    w.close() 
+1

不需要編解碼器Python 3,'open'也支持'encoding'參數。 –

+0

@MarkRansom感謝您指出。實際上,我是python2的開發人員... :) – Enix

+0

我現在有另一個函數錯誤。 'File'LOCATION',第45行,在refill中replace_line('Products.txt',str(line),tenminus_str)''File「LOCATION」,第6行,in replace_line lines [line_num] = text' TypeError:list indices必須是整數,而不是str'這是什麼意思,我該如何解決? –

-1

處理的編碼問題,您可以嘗試添加以下設置你的頭


import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 
Type = sys.getfilesystemencoding() 
+0

不可以。[爲什麼sys.setdefaultencoding會破壞代碼](https://anonbadger.wordpress.com/2015/06/16/why-sys-setdefaultencoding-will-break-code-) –

2

改變你的函數:

def replace_line(file_name, line_num, text): 
    with open(file_name, 'r', encoding='utf8') as f: 
     lines = f.readlines() 
    lines[line_num] = text 
    with open(file_name, 'w', encoding='utf8') as out: 
     out.writelines(lines) 

encoding='utf8'將正確解碼您的UTF-8文件。

with當它的塊被退出時自動關閉該文件。

由於您的文件以\xef開頭,因此它可能在開始時具有UTF-8編碼的字節順序標記(BOM)字符。上面的代碼將保持輸出,但如果你不希望它使用utf-8-sig輸入編碼。然後它會被自動刪除。

相關問題