鍍金池/ 教程/ Python/ exercise15.讀文件
附錄 A-練習(xí) 9:生成一個(gè)空文件(Touch, New-Item)
附錄 A-練習(xí) 10:復(fù)制文件 (cp)
exercise44.繼承 Vs.包含
附錄 A-練習(xí) 14:刪除文件 (rm)
附錄 A-練習(xí) 11:移動文件 (mv)
exercise46.項(xiàng)目骨架
附錄 A-練習(xí) 3:如果你迷路了
exercise37.復(fù)習(xí)符號
exercise47.自動化測試
exercise3.數(shù)字和數(shù)學(xué)計(jì)算
附錄 A-練習(xí) 1:安裝
exercise32.循環(huán)和列表
exercise31.做出決定
exercise42.對象、類、以及從屬關(guān)系
exercise48.更復(fù)雜的用戶輸入
下一步
簡介
附錄 A-練習(xí) 7:刪除路徑 (rmdir)
exercise49.寫代碼語句
exercise18.命名, 變量, 代碼, 函數(shù)
exercise12.提示別人
exercise14.提示和傳遞
exercise40.模塊, 類和對象
附錄 A-練習(xí) 12:查看文件 (less, MORE)
exercise9.打印, 打印, 打印
exercise13.參數(shù), 解包, 變量
exercise30. Else 和 If
exercise28. 布爾表達(dá)式
附錄 A-練習(xí) 4:創(chuàng)建一個(gè)路徑 (mkdir)
附錄 A-練習(xí) 15:退出命令行 (exit)
exercise25. 更多更多的練習(xí)
exercise6.字符串和文本
exercise2.注釋和井號“#”
exercise21. 函數(shù)的返回值
附錄 A-下一步
exercise1.第一個(gè)程序
exercise23. 閱讀代碼
附錄 A-練習(xí) 5:改變當(dāng)前路徑 (cd)
exercise17.更多文件操作
exercise24. 更多的練習(xí)
exercise19.函數(shù)和變量
exercise51.從瀏覽器獲取輸入
exercise22. 到目前為止你學(xué)到了什么?
exercise41.學(xué)會說面向?qū)ο?/span>
exercise52.開始你的 web 游戲
exercise20. 函數(shù)和文件
exercise15.讀文件
exercise45.你來制作一個(gè)游戲
exercise10.那是什么?
exercise8.打印, 打印
exercise35.分支和函數(shù)
exercise26. 恭喜你,可以進(jìn)行一次考試了
exercise33.while 循環(huán)
exercise29. IF 語句
exercise36.設(shè)計(jì)和調(diào)試
exercise0.安裝和準(zhǔn)備
exercise50.你的第一個(gè)網(wǎng)站
附錄 A-練習(xí) 2:路徑, 文件夾, 名錄 (pwd)
exercise38.列表操作
附錄 A-練習(xí) 6:列出當(dāng)前路徑 (ls)
exercise16.讀寫文件
exercise4.變量和命名
exercise34.訪問列表元素
exercise11.提問
exercise43.基本的面向?qū)ο蟮姆治龊驮O(shè)計(jì)
附錄 A-簡介
附錄 A-練習(xí) 8:目錄切換(pushd, popd)
來自老程序員的建議
exercise27. 記住邏輯
exercise5.更多的變量和打印
exercise7.更多的打?。ㄝ敵觯?/span>
附錄 A-練習(xí) 13:輸出文件 (cat)
exercise39.字典,可愛的字典

exercise15.讀文件

你已經(jīng)學(xué)過 raw_input 和 argv,這些是你開始學(xué)習(xí)讀取文件的必備基礎(chǔ)。你可能需要多多實(shí)驗(yàn)才能明白它的工作原理,所以你要細(xì)心做練習(xí),并且仔細(xì)檢查結(jié)果。處理文件需要非常仔細(xì),否則,你可能會把有用的文件弄壞或者清空。導(dǎo)致前功盡棄。

這節(jié)練習(xí)涉及到寫兩個(gè)文件。一個(gè)正常的 ex15.py 文件,另外一個(gè)是 ex15_sample.txt,第二個(gè)文件并不是腳本,而是供你的腳本讀取的文本文件。以下是后者的內(nèi)容:

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

我們要做的是用我們的腳本“打開(open)”這個(gè)文件,然后打印出來。然而把文件名 ex15_sample.txt 寫死在代碼中并不是一個(gè)好主意,這些信息應(yīng)該是用戶輸入的才對。如果我們碰到其他文件要處理,寫死的文件名就會給你帶來麻煩了。我們的解決方案是使用 argv 和 raw_input 來從用戶獲取信息,從而知道哪些文件該被處理。

from sys import argv

script, 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()

這個(gè)腳本中有一些新奇的玩意,我們來快速地過一遍:

代碼的 1-3 行使用 argv 來獲取文件名,這個(gè)你應(yīng)該已經(jīng)熟悉了。接下來第 5 行我們看到 open 這個(gè)新命令。現(xiàn)在請?jiān)诿钚羞\(yùn)行 pydoc open 來讀讀它的說明。你可以看到它和你自己的腳本、或者 raw_input 命令類似,它會接受一個(gè)參數(shù),并且返回一個(gè)值,你可以將這個(gè)值賦予一個(gè)變量。這就是你打開文件的過程。

第 7 行我們打印了一小行信息,但在第 8 行我們看到了新奇的東西。我們在 txt 上調(diào)用了一個(gè)函數(shù)。你從 open 獲得了一個(gè)文件,文件本身也支持一些命令。它接受命令的方式是使用句點(diǎn) . (英文稱作 dot 或者 period),緊跟著你的命令,然后是類似 open 和 raw_input 一樣的參數(shù)。不同點(diǎn)是:當(dāng)你執(zhí)行 txt.read 時(shí),你的意思其實(shí)是:“嘿 txt!執(zhí)行你的 read 命令,無需任何參數(shù)!”

腳本剩下的部分基本差不多,不過我就把剩下的分析作為附加題留給你自己了。

你看到的結(jié)果

我創(chuàng)建了一個(gè)名字叫做 ex15_sample.txt 的文件,然后執(zhí)行我的腳本:

$ 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.

附加題

這節(jié)的難度跨越有點(diǎn)大,所以你要盡量做好這節(jié)加分習(xí)題,然后再繼續(xù)后面的章節(jié)。

1.在每一行的上面加上注釋。 2.如果你不確定答案,就問別人,或者上網(wǎng)搜索。大部分時(shí)候,只要搜索 “python” 加上你要搜的東西就能得到你要的答案。比如搜索一下“python open”。 3.我使用了“命令”這個(gè)詞,不過實(shí)際上它們的名字是“函數(shù)(function)”和“方法(method)。上網(wǎng)搜索一下這兩者的意義和區(qū)別??床幻靼滓矝]關(guān)系,這本書后面也會講到這些。 4.刪掉 10-15 行使用到 raw_input 的部分,再運(yùn)行一遍腳本。 5.只用 raw_input 寫這個(gè)腳本,想想哪種得到文件名稱的方法更好?為什么? 6.運(yùn)行 python 在命令行下使用 open 打開一個(gè)文件,這種 open 和 read 的方法也值得你一學(xué)。 7.讓你的腳本對 txt 和 txt_again 兩個(gè)變量執(zhí)行一下 close(),處理完文件后你需要將其關(guān)閉,這是很重要的一點(diǎn)。

常見問題

Q:txt = open(filename)返回的是文件的文本內(nèi)容嗎?

不是的。它的返回值我們稱為“文件對象”。你可以把文件想象成 19 世紀(jì) 50 年代的大型計(jì)算機(jī)上的老舊的磁帶驅(qū)動器, 或者是像現(xiàn)在的 DVD 播放器,你可以在他們內(nèi)部走動,然后閱讀他們。但是文件對象并不是文件的文本內(nèi)容一樣就好像 DVD 播放器也不是一個(gè) DVD 視頻.

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

首先,在命令行里輸入 python 并回車,現(xiàn)在你已經(jīng)進(jìn)入了一個(gè) python 解析器。接下來你就可以輸入一系列的代碼,python 會一一執(zhí)行你的代碼。最后別忘了輸入 quit()并回車退出 python。

Q:當(dāng)我打開同一個(gè)文件兩次的時(shí)候,為什么不會報(bào)錯(cuò)?

Python 不會限制你只能打開一個(gè)文件一次,有時(shí)這是必要的。

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

目前來說,你可以認(rèn)為 sys 是一個(gè)包,這句代碼的意思是從 sys 的包中引入 argv 功能模塊。

Q: 我把文件的名字放進(jìn)腳本中,ex15_sample.txt = argv,卻沒有生效。

你不能這么寫,請按照我的示例寫代碼,并像我一樣在命令行里運(yùn)行腳本。