1. 程式人生 > >Python基礎知識(三)

Python基礎知識(三)

檔案操作

1. 讀檔案

input和argv,這些是你開始學習讀取檔案的必備基礎。你可能需要多多實驗才能明白它的工作原理,所以你要細心做練習,並且仔細檢查結果。處理檔案需要非常仔細,否則,你可能會把有用的檔案弄壞或者清空。導致前功盡棄。

這節練習涉及到寫兩個檔案。一個正常的 ex15.py 檔案,另外一個是 ex15_sample.txt,第二個檔案並不是指令碼,而是供你的指令碼讀取的文字檔案。以下是後者的內容:

This is stuff I typed into a file.
It is really cool stuff.
Lots and lots of fun to have in
here.

我們要做的是用我們的指令碼“開啟(open)”這個檔案,然後打印出來。然而把檔名ex15_sample.txt寫死在程式碼中並不是一個好主意,這些資訊應該是使用者輸入的才對。如果我們碰到其他檔案要處理,寫死的檔名就會帶來麻煩了。我們的解決方案是使用argv和input來從使用者獲取資訊,從而知道哪些檔案該被處理。

 1.from sys import argv
 2.
 3.script, filename = argv
 4.
 5.txt = open(filename)
 6.
 7.print ("Here's your file %r:" % filename)
8.print (txt.read()) 9. 10.print ("Type the filename again:") 11.file_again = input("> ") 12. 13.txt_again = open(file_again) 14. 15.print (txt_again.read())

程式碼解析:
第 1-3 行是使用argv來獲取檔名。
第 5 行是open這個新命令。現在請在命令列執行pydoc open 來讀讀它的說明。可以看到它和你自己的指令碼、或者input命令類似,它會接受一個引數,並且返回一個值,可以將這個值賦予一個變數。
第 7 行列印了一小行資訊。
第 8 行在 txt 上呼叫了一個函式。從open獲得了一個檔案,檔案本身也支援一些命令。它接受命令的方式是使用句點 . (英文稱作 dot 或者 period),緊跟著你的命令,然後是類似 open 和 input 一樣的引數。不同點是:當你執行txt.read時,意思其實是:“執行txt的 read 命令,無需任何引數!”

結果
前面建立了一個名字叫做ex15_sample.txt的檔案,然後執行指令碼:

$ python ex15.py ex15_sample.txt
Here's your file 'ex15_sample.txt':
This is stuff I typed into a file.
It is really cool stuff.
Lots and lots of fun to have in here.

Type the filename again:
>  ex15_sample.txt
This is stuff I typed into a file.
It is really cool stuff.
Lots and lots of fun to have in here.

常見問題
Q:txt = open(filename)返回的是檔案的文字內容嗎?

不是的。它的返回值我們稱為“檔案物件”。你可以把檔案想象成19世紀50年代的大型計算機上的老舊的磁帶驅動器, 或者是像現在的DVD播放器,你可以在他們內部走動,然後閱讀他們。但是檔案物件並不是檔案的文字內容一樣就好像DVD播放器也不是一個DVD視訊.

Q:我不能按照你在附加題7中說的那樣在命令列輸入程式碼

首先,在命令列裡輸入python並回車,現在你已經進入了一個python解析器。接下來你就可以輸入一系列的程式碼,python會一一執行你的程式碼。最後別忘了輸入quit()並回車退出python。

Q:當我開啟同一個檔案兩次的時候,為什麼不會報錯?

Python不會限制你只能開啟一個檔案一次,有時這是必要的。

Q:from sys import argv 這句是什麼意思?

目前來說,你可以認為sys是一個包,這句程式碼的意思是從sys的包中引入argv功能模組。

Q: 我把檔案的名字放進指令碼中,ex15_sample.txt = argv,卻沒有生效。

你不能這麼寫,請按照我的示例寫程式碼,並像我一樣在命令列裡執行指令碼。

2. 讀寫檔案

檔案相關的各種命令(方法/函式)。下面的這張表,是你應該記住的命令:

close -- 關閉檔案。跟你編輯器的 檔案->儲存.. 一個意思。
read -- 讀取檔案內容。你可以把結果賦給一個變數。
readline -- 讀取文字檔案中的一行。
truncate -- 清空檔案,請謹慎使用該命令。
write('stuff') -- 將stuff寫入檔案。

注意:有些命令需要接受引數。只要記住 write 需要接收一個字串作為引數,從而將該字串寫入檔案。
讓我們來使用這些命令做一個簡單的文字編輯器吧:

from sys import argv

script, filename = argv

print ("We're going to erase %r." % filename)
print ("If you don't want that, hit CTRL-C (^C).")
print ("If you do want that, hit RETURN.")

input("?")

print ("Opening the file...")
target = open(filename, 'w')

print ("Truncating the file.  Goodbye!")
target.truncate()

print ("Now I'm going to ask you for three lines.")

line1 = input("line 1: ")
line2 = input("line 2: ")
line3 = input("line 3: ")

print ("I'm going to write these to the file.")

target.write(line1)
target.write("\n")
target.write(line2)
target.write("\n")
target.write(line3)
target.write("\n")

print ("And finally, we close it.")
target.close()

大的檔案執行起來是有一個小技巧的,就是你可以讓你的指令碼一部分一部分地執行起來。先寫 1-8 行,讓它執行起來,再多執行5行,再接著多執行幾行,以此類推,直到整個指令碼執行起來為止。

結果
你將看到兩樣東西,一個是你指令碼的輸出:

$ python ex16.py test.txt
We're going to erase 'test.txt'.
If you don't want that, hit CTRL-C (^C).
If you do want that, hit RETURN.
?
Opening the file...
Truncating the file.  Goodbye!
Now I'm going to ask you for three lines.
line 1:  Mary had a little lamb
line 2:  Its fleece was white as snow
line 3:  It was also tasty
I'm going to write these to the file.
And finally, we close it.

接下來開啟你新建的檔案(test.txt)檢查一下里邊的內容吧.

常見問題

Q:truncate()方法必須要有引數’w’嗎?
不是必須的,把truncate那句函式遮蔽後,程式碼仍舊可以正常執行,write會將原有內容自動清空,進行寫入,所以手動清空不是必須的。

target.truncate([size]) #把檔案裁成規定的大小,預設的是裁到當前檔案操作標記的位置。如果size比檔案的大小還要大,依據系統的不同可能是不改變檔案,也可能是用0把檔案補到相應的大小,也可能是以一些隨機的內容加上去。

Q: 'w’引數是什麼意思?

它只是開啟檔案的一種模式。如果你用了這個引數,表示"以寫(write)模式開啟檔案。同樣有’r’表示只讀模式,'a’表示追加模式,還有一些其他的修飾符。

Q: 有什麼修飾符我可以用在開啟檔案的模式上?

最重要的一個就是+, 使用它,你可以有’w+’, ‘r+’, 和’a+'模式. 這樣可以同時以讀寫模式開啟檔案。

Q: open(filename)是以’r’ (只讀) 模式開啟檔案嗎?

是的,‘r’ 是 open()函式的預設引數值。