2012-11-22 35 views
1

可能重複:
Weird behavior when writing and reading file文件意外行爲蟒蛇

當我嘗試寫入一個文件,然後讀取它,我得到一個意外的結果。

我的代碼是:

f=open("z.txt","w+") 
f.write("Hello") 
content=f.read() 
print content 
f.close() 

所輸出的文件是:

Hellolףן(I11(S'QUEUE 'P1(S'exec' P2 S」 run code'p3 (cidlelib.rpc unpickle_code p4 (S'c \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 @ \ x00 \ x00 \ x00s6 \ x00 \ x00 \ x00e \ X00 \ x00d \ X00 \ x00d \ X01 \ X00 \ X83 \ X02 \ x00Z \ X01 \ x00e \ X01 \ x00j \ X02 \ x00d \ X02 \ X00 \ X83 \ X01 \ X00 \ x01e \ X01 \ x00j \ X03 \ X00 \ X83 \ X00 \ x00Z \ X04 \ x00e \ X01 \ x00j \ X05 \ X00 \ X83 \ X00 \ X00 \ x01d \ X03 \ x00S(\ X04 \ X00 \ X00 \ x00s \ X05 \ X00 \ X00 \ x00z.txts \ X02 \ X00 \ X00 \ x00w + T \ X05 \ X00 \ X00 \ x00HelloN(\ X06 \ X00 \ X00 \ x00t \ X04 \ X00 \ X00 \ x00opent \ X01 \ X00 \ X00 \ x00ft \ X05 \ X00 \ X00 \ x00writet \ X04 \ X00 \ X00 \ x00readt \ X07 \ X00 \ X00 \ x00contentt \ X05 \ X00 \ X00 \ x00close(\ X00 \ X00 \ X00 \ X00(\ X00 \ X00 \ X00 \ X00(\ X00 \ X00 \ X00 \ x00s \ X17 \ X00 \ X00 \ x00C:/用戶/ X /桌面/ ZT \ X08 \ X00 \ X00 \ X00 \ X01 \ X00 \ X00 \ x00s \ X06 \ X00 \ X00 \ X00 \ X0F \ x01 \ r \ x01 \ x0c \ x01' tRp5 tp6(dp7 ttp8 tp9。 '2רְז|lAk!
€QG CK器PCK $ְBKאBKנBK 8Ck
XCK XBkxBk°CK |!CKנCkDk
@」(Ck~CkķצCK CK
ְPG DKDֽ~˚F€QG + ~Ck
(DK @k @k XDKר·K @fHDkhDkpDk ~Dk
נDkEk0EkPEkְ」 Kצ
ְPG!〜F,
「的Dk

@k @k      ר?k 

我在做什麼錯?

+5

首先,你的'.read()'將會已經返回一個空字符串,因爲寫入將文件位置放在最後。其次,'w +'模式會截斷文件,導致文件在打開時爲空。您看到的額外數據在*此程序運行後添加*。你還用這個文件做了什麼?顯示的代碼中沒有任何內容會添加額外的數據,但[pickle'模塊](http://docs.python.org/2/library/pickle.html)輸出看起來很像您在此粘貼的內容。 –

回答

2

我相信這是一個Windows的問題,與文件系統的塊大小做。如果你.flush().write()之前你.read(),它會正常工作。我可以在Win7上重現它。我認爲發生的事情是Windows以4KB的塊爲單位分配你的文件,所以編寫"Hello"會讓你碰到下一個塊的大小,如果你的話.read()會從塊的其餘部分得到亂碼,因爲Python如果你在.read()之前.flush(),Python會正確寫出文件,然後你得到一個空字符串。)

+0

所以實際上這是python的內存處理錯誤? – Lior

+0

@ user1718294這不是一個錯誤。 Python'file.read()'是簡單的'fread()'C函數的封裝,[C standards](http://stackoverflow.com/a/2230732/63011)表示你應該總是flush(或尋求)你的流,以獲得正確的結果。 –

+0

@PaoloMoretti好的,謝謝:) – Lior

0
f=open("z.txt","w+") 
f.write("Hello") 
f.seek(0) 
content=f.read() 
print content 
f.close() 

我失蹤
f.seek(0)

+0

這並不能解釋你的額外泡菜數據,但如果這回答你的問題。 –

+0

@Martijn Pieters是的,它解決了我的問題,現在該文件還包含文本「你好」,而不是其他胡言亂語的東西。 – Lior

+0

那麼亂碼是從哪裏來的呢?它似乎仍然是一個謎。它根本不應該在那裏。 –