第一個程式
a = open('test.txt','w')
a.write('jdhfjkf')
a.write('\n')
a.write('zbvbvxsg')
a.close()
第二個程式
open('test.txt','w').write('jdhfjkf')
open('test.txt','w').write('\n')
open('test.txt','w').write('zbvbvxsg')
open('test.txt','w').close()
我感覺它們應該是一樣的。可是為什麼只有第一個程式能寫入test.txt,而第二個程式的執行結果是空白?
(我想:是不是一個檔案只用open和'w'一次,否則,每一次'w' 都會把前面寫入的東西清空。可是問題又來了,我把第二個程式第四行去掉,第三行就能寫入,可是加上第四行,又變成了空白)這個我懂了
新問題:第一個程式裡面,a作為一個變數,也有'w'啊,每次執行a.write()時,不也和第二個程式差不多嗎?應該也是每write一次,就把前面的清空?
回複內容:
每次w open檔案都會把檔案清空題主你看我也從來沒有用過Python,看到你這個問題後我就順手查了一下文檔
open() returns a file object, and is most commonly used with two arguments: open(filename, mode).
>>>
>>> f = open('workfile', 'w')>>> print f
寫檔案有兩種模式:一種叫truncate(截斷),一種叫append(追加)。前者每次開啟檔案都會把檔案已有的內容刪除,再寫入內容;後者每次開啟檔案不會刪除已有內容,而是在已有內容之後在寫入內容。剩下的題主自己想想?
========================================================================
學東西,還是好好先找幾本書,把基礎打好才對。看文檔。先給出題主提出的新問題的答案,清空內容不是在File Objects 調用write時發生的,而是在用“w”模式open檔案時發生的
題主其實在兩個地方存在疑惑,"w"模式的特性 , 以及file.close的作用
分開說明。
關於file.close,Python文檔裡說的很清楚了,看這裡:file.write
,我引用一下
Due to buffering, the string may not actually show up in the file until the flush()
or close()
method is called.
至於w模式的問題,Python文檔並沒有把這件事說清,也可能是我沒看到:),我在stackoverflow上看到過極好的說明:python open built-in function: difference between modes a, a+, w, w+, and r+?
從中我們可以看到“w”模式的問題其實和Python關係不大,要理解它的特性,需要追溯到C標準庫中的
fopen()函數,定義如下
"w'' Truncate file to zero length or create text file for writing. The stream is positioned at the beginning of the file.
我從沒見過你這麼乾的。
我不明白你是怎麼把 “開啟→讀/寫→關閉”這個過程理解成這樣子的。我理解中多次開啟同一檔案是不應出現的行為。
def writeFile() : file = open('test.txt','w+') file.write('testtesttest') file.write('\n') file.write('new line') file.close()
open的各個參數功能應該會有相應的講解,簡單說題中所講:
'w'開啟並清空檔案,如果是沒有檔案則重新建立。
如果需要你多次操作能夠寫入,需要用‘a'的參數。如果你把你第二段代碼的'w'改成'a'的話其實你也會發現沒有得到預期的效果。原因何在呢?其實,檔案的寫入位置很巧妙,有點類似於C語言種的指標操作。而每次重新開啟之後,指標又重新歸零。如果是你寫入的第一個字串很長的話,你就會發現還是保留了一部分資訊的。
簡單寫一下例子如下:
如上面的代碼,每次開啟之後全都清空檔案。最後,第6行代碼把檔案清空。如上面的代碼,每次開啟之後全都清空檔案。最後,第6行代碼把檔案清空。
結果如下:
如果換成'a',那麼每次重新開啟的話,寫入從檔案開頭寫入。
代碼以及結果如下(需要注意的是,後面我故意寫的那一串字母tttttt,由於每次寫入的位置是開始,但是寫入的長度不夠,因此後面的tttt等字元沒有被覆蓋掉):
再看一個例子,把追加參數改成'a+'(這樣,寫入的“指標就一直保留在上次的位置”):
基礎太重要了,只open不close就是在耍流氓。建議去學學C/C++,看看異地中午檔案控制代碼只open不close是什麼情況。答案就像你說的那樣,每次用open('test.txt','w')開啟檔案時,都會把前面的清空。如果不清楚這個過程中到底發生了什麼,可以在每個write下面加上print列印出來
open('test.txt','w').write('jdhfjkf')print open('test.txt','r').readlines()open('test.txt','w').write('\n')print open('test.txt','r').readlines()open('test.txt','w').write('zbvbvxsg')print open('test.txt','r').readlines()open('test.txt','w').close()