Exercise 15:讀文件

原文鏈接:http://learnpythonthehardway.org/book/ex15.html

       你已經學習了關於 raw_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.
        我們想要做的就是在我們腳本中打開這個文件並且把其中的內容打印出來。然而,我們不想用“硬編碼”的方式來那個將名爲 ex15_sample.txt的文本內容加載到我們的腳本中。“硬編碼”的意思是把本應該來自用戶輸入內容寫作一個常量的字符串信息放到我們的腳本中。這是不好的做法,因爲在後面我們還想加載其他文件內容。解決這個問題的辦法就是使用 argv 和 raw_input 來要求用戶輸入想要讀取的文件名來來代替“硬編碼”方式設置的文件名。

from sys import argv

scipt ,filename = argv

txt = open(filename)

print "Here's your file %r:" % filename
print txt.read()

print "Type the filename again:"
file_again = raw_input("> ")

txt_again = open(file_again)

print txt_again.read()
這個腳本文件中將會發生一些神奇的事情,讓我們趕緊來分析一下這個些代碼:

       1~3行是我嗎所熟悉的使用 argv 來得到一個文件名。在下面的五行中有一個新的命令 open 。現在,運行 pydoc open相關命令閱讀對這個命令的介紹。主要到這其實很像你
腳本中的 raw_input功能,都是得到一個相關參數後將其賦給你自己的一個變量。這裏你只是用open做了一個打開文件的操作。

       在第7行我們打印了一小行文本,但是在第8行就有一個新奇的東西了。我們調用了txt上的一個函數。txt 就是打開 file 後返回的一個值,並且它可以接受你給它的指令。一個文件名可以通過 “."(點 或者 英式句號),指令名稱和參數三個組成來調用一個相關指令。就行如 open 和 raw_input 函數一樣。不同之處在於當你說 txt.read()你的意思就是:“嘿,txt !你讀取了一個沒有帶參數的指令”。

       程序中剩下的幾行原理都差不多,所以剩下的幾個就留在研究訓練中讓你來分析。

輸出結果如下:

我創建了一個名爲 “ex15_sample.txt” 的文本然後運行我的腳本。
E:\>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.

研究訓練:

這次練習有一個比較大的跳躍,在你繼續往下學習之前儘可能的做好研究訓練中的練習。
1、上面的每一行代碼用英文寫下他們都做了什麼事情。
2、如果你不是很確定你可以問別人或者在線搜索。很多時候搜索“python THING"類似的關鍵字就可以找到關於THING在python中起了什麼作用的回答。試着搜索下”python open“。
3、在這裏我使用了”指令“這個詞,但是它們通常也被稱作”函數“或者”方法“。在網上搜索下看看別人是怎麼定義的。不要擔心他們迷惑你,一些知識淵博的程序員的回答讓你感到迷惑時很正常的事情。
4、去掉使用了raw_input 的10~15行代碼然後在運行該腳本。
5、運行只有raw_input 的10~15行代碼的腳本。想想爲什麼這種方式獲取文件名比上一種更好。
6、運行 pydoc file 命令然後往下滾動直到看見了read() 指令(函數或方法)。你應該能看見一些其它的指令了吧?跳過所有前面帶有_ _(兩個下劃線)的內容,因爲這些內容是沒有實際用處的。然後嘗試着使用一下其它指令吧。
7、再次運行 python 並且通過提示符的方式來使用open打開一個文件。注意你怎樣才能正確的打開和讀取一個文本呢?
8、在你的腳本中對 txt 和 txt_again 變量做 close()函數操作,當你讀取完一個文本後關閉它是一個非常重要的操作。

學生遇見的常見問題:

txt = open(filename) 表達式是返回文件的文本內容嗎?
答:不是的,它不會返回文本內容。它實際上是返回了一個被稱作”文件句柄“的東西。你可以認爲它像一個在一臺二十世紀50年代大型計算機上的舊的磁帶驅動器,或者像現在的DVD播放器一樣。你可以把它們放在裏面來回旋轉,然後”讀取“上面的東西,但是這裏的文件是沒有目錄的。

我不能按照你”研究訓練“中的第七個說的那樣在終端或者命令行工具中輸入相關代碼。
答:首先,你應該在命令行中只輸入 python 然後單擊Enter。那麼現在你就是在 python 中就像我們之前做過的幾次操作那樣。一旦你進入了 python 中你就可以直接在裏面輸入代碼python將會一小塊一小塊的運行你的代碼。就按我說的這樣操作。你可以通過輸入 quit() 單擊 Enter來退出這種模式。

from sys import argv起了什麼作用?
答:現在你只要理解 sys 是一個封裝,這段代碼的作用就是從這個封裝中得到 argv 的功能。在後面可以學到更多相關這個的知識。

我像這樣:script ,ex15_sample.txt = argv 來傳遞文件名但是無效。
答:肯定沒用的,都不知道你怎麼會這麼寫。把你的代碼寫的和我的一樣,然後也像我一樣輸入命令來運行腳本。你這樣做根本沒有把文件名傳入腳本中,而是還是讓Python來傳入文件名。

爲什麼我打開了兩次文件卻沒有出現錯誤?
答:Python 不會限制你不止一次打開文本但有時限制也是有必要的。

發佈了23 篇原創文章 · 獲贊 7 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章