2015-08-25 59 views
1

我想弄清楚在這種情況下發生了什麼。我在Windows 7 64位上,我正在用Python進行Unicode測試。什麼是寫入文件時造成這種垃圾

用下面的Python代碼

#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
#aaaaaa 

x = [u'\xa3'] 

f = open('file_garbage.txt', 'w+') 
for s in x: 
    if s in f.read(): 
     continue 
    else: 
     f.write(s.encode('utf-8')) 
f.close() 

我沒有得到任何錯誤信息,並file_garbage.txt包含

£ 

當我添加另一個項目爲x像這樣

#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
#aaaaaa 

x = [u'\xa3', 
    u'\xa3'] 

f = open('file_garbage.txt', 'w+') 
for s in x: 
    if s in f.read(): 
     continue 
    else: 
     f.write(s.encode('utf-8')) 
f.close() 

我得到UnicodeDecodeError

Traceback (most recent call last): 
    File "file_garbage.py", line 9, in <module> 
    if s in f.read(): 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 2: ordinal not in range(128) 

file_garbage.txt將包含任一大約250行的字節這樣

c2a3 4b02 e0a6 5400 6161 6161 6161 6161 
6161 6161 6161 6161 6161 6161 6161 6161 
6161 6161 6161 6161 6161 610d 0a23 6161 
6161 6161 0d0a 0d0a 7820 3d20 5b75 275c 
7861 3327 2c0d 0a20 2020 2020 7527 5c78 
6133 275d 0d0a 0d0a 6620 3d20 6f70 656e 
2827 6669 6c65 5f67 6172 6261 6765 2e74 

垃圾等在此

£Kà¦éaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
#aaaaaa 

x = [u'\xa3', 
    u'\xa3'] 

f = open('file_garbage.txt', 'w+') 
for s in x: 
    if s in f.read(): 
     continue 
    else: 
     f.write(s.encode('utf-8')) 
f.close() 
Python Character Mapping Codec cp1252 generated from 'MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT' with gencodec.py. 

iÿÿÿÿNt 

接着一串ENQ,DC2,SOH,STX,NUL的符號和鏈接:

垃圾
C:\Python27\lib\encodings\cp1252.py 

圖片:

garbage

我猜測,這是做編碼和/或我處理文件的方式有問題,但我感到困惑究竟是什麼發生的事情,爲什麼結果似乎有所不同。

垃圾似乎只有在文件頂部看似隨機的幾個註釋字符串時纔會生成,但字節總是會以其他方式生成。

如果有幫助,我的系統編碼設置如下:

sys.stdout.encoding   : cp850 
sys.stdout.isatty()   : True 
locale.getpreferredencoding() : cp1252 
sys.getfilesystemencoding() : mbcs 
+1

您是否試圖寫入代碼運行的同一個文件?你的例子看起來像你說垃圾在'file_garbage.py'中,但是你的代碼顯示你打開了一個名爲'file_garbage.txt'的東西。 – BrenBarn

+0

不,我想從'file_garbage.py'寫入一個名爲'file_garbage.txt'的單獨文本文件,我剛剛命名了兩個文件file_garbage進行測試,對於混淆 – Teleshot

+1

因此,您正在嘗試寫入'file_garbage.txt ',但'file_garbage.py'實際上被修改? – BrenBarn

回答

2

這可能是該文件被損壞,因爲它沒有正確關閉。我從來沒有見過這種特殊的行爲,但它處於可能性的範圍之內。試着改變你的代碼中使用with

with open('file_garbage.txt', 'w+') as f: 
    # do your stuff here 

這將確保即使拋出一個異常文件被關閉。

異常的原因是x包含unicode字符串,但是當您在f中讀取時,您正在以字節爲單位讀取。當您嘗試檢查s in f.read()時,它會嘗試將unicode字符串與文件中的字節進行比較,並且因文件中的字節無法解釋爲unicode而失敗。您需要將文件的內容解碼爲unicode。

您的代碼有一些其他問題,這些問題超出了這個問題的範圍。對於初學者來說,在這樣的循環中使用f.read()將不起作用,因爲第一次讀取將讀取整個文件,隨後的讀取將不會返回任何內容。相反,首先將文件讀取(並解碼)爲一個變量,然後對該變量進行比較。另外,我不確定在w+模式下讀取和寫入文件是否可以做到您想要的。(我不確定你想要你的代碼做什麼。)由於documented,w+會截斷文件,所以你將無法通過添加已經存在的文件來「更新」它。

+0

使用'with'並將解碼的f.read()存儲在一個變量中然後檢查變量確實解決了問題。在這個例子中,我只是暫時使用'w +'來測試垃圾輸出,以前我使用'a +'來讀取和附加到文件。非常感謝你解決我的困惑。 – Teleshot

相關問題