# 練習17.更多文件操作
現在讓我們再學習幾種文件操作。我們將編寫一個Python腳本,將一個文件中的內容拷貝到另外一個文件中。這個腳本很短,不過它會讓你對于文件操作有更多的了解。
~~~
from sys import argv
from os.path import exists
script, from_file, to_file = argv
print "Copying from %s to %s" % (from_file, to_file)
# we could do these two on one line, how?
in_file = open(from_file)
indata = in_file.read()
print "The input file is %d bytes long" % len(indata)
print "Does the output file exist? %r" % exists(to_file)
print "Ready, hit RETURN to continue, CTRL-C to abort."
raw_input()
out_file = open(to_file, 'w')
out_file.write(indata)
print "Alright, all done."
out_file.close()
in_file.close()
~~~
你應該很快注意到了我們`import`了又一個很好用的命令`exists`。這個命令將文件名字符串作為參數,如果文件存在的話,它將返回`True`,否則將返回 `False`。在本書的下半部分,我們將使用這個函數做很多的事情,不過現在你應該學會怎樣通過 import 調用它.
通過使用`import`,你可以在自己代碼中直接使用其他更厲害的(通常是這樣,不過也不 盡然)程序員寫的大量免費代碼,這樣你就不需要重寫一遍了。
## 你看到的結果
和你前面寫的腳本一樣,運行該腳本需要兩個參數,一個是待拷貝的文件,一個是要拷貝至的文件。我再創建一個名為`test.txt`的測試文件,我們將看到如下的結果:
~~~
$ echo "This is a test file." > test.txt
~~~
$ cat test.txt This is a test file. $ $ python ex17.py test.txt new_file.txt Copying from test.txt to new_file.txt The input file is 21 bytes long Does the output file exist? False Ready, hit RETURN to continue, CTRL-C to abort.
~~~
Alright, all done.
~~~
該命令對于任何文件都應該是有效的。試試操作一些別的文件看看結果。不過小心別把你的重要文件給弄壞了。
> **Warning:**你看到我用`echo`命令創建一個文件,并用`cat`命令展示一個文件了吧?它們只能在 Linux 和 OSX 下使用,你可以閱讀附錄A獲得者兩個命令的使用方法。
## 附加題
> 1. 這個腳本 實在是有點煩人。沒必要在拷貝之前問一遍把,沒必要在屏幕上輸出那么多東西。試著刪掉腳本的一些功能,讓它使用起來更加友好。
> 1. 看看你能把這個腳本改多短,我可以把它寫成一行。
> 1. 我使用了一個叫`cat`的東西,這個古老的命令的用處是將兩個文件“連接(con*cat*enate)”到一起,不過實際上它最大的用途是打印文件內容到屏幕上。你可以通過 `man cat` 命令了解到更多信息。(windows下沒有這個命令)
> 1. 找出為什么你需要在代碼中寫 output.close() 。
> 1. 再多讀讀和`import`相關的材料,將python運行起來,試試這一條命令。試著看看自己能不能摸出點門道,當然了,即使弄不明白也沒關系。
## 常見問題
### Q: 為什么`'w'`要寫在引號里?
> 它只是個字符串,你已經做過太多關于字符串的練習了,你知道什么是字符串的,對嗎?
### Q:總是感覺這些練習很難,這正常嗎?
> 這很正常的。直到你做完練習36甚至完成這本書的學習,用python做出一些作品,編程對你來說可能都不是一件簡單的事情。每個人都不一樣,所以只要堅持復習你認為困難的習題,直到你真的搞明白它們,要有耐心。
### Q:函數`len()`是干什么用的?
> 它能獲得參數的長度,返回值是一個數字,你試著用用這個方法。
### Q:我嘗試改短代碼的時候,在腳本的結尾處遇到一個關于文件關閉的問題。
> 你可能做了一些類似這樣的事情,比如`indata = open(from_file).read()`,這樣寫的話,就不需要在執行關閉操作,當執行完這一行的時候,文件自動就被關閉了。
### Q: 我遇到一個異常`Syntax:EOL while scanning string literal`
> 你應該是忘記在字符串的結尾加上引號了,回到你出錯的那行代碼,檢查一下。
- 序言
- 前言
- 簡介
- 0:安裝和準備
- 1:第一個程序
- 2:注釋和“#”井號
- 3:數字和數學計算
- 4:變量和命名
- 5:更多的變量和打印
- 6:字符串和文本
- 7:更多的打印(輸出)
- 8:打印, 打印
- 9:打印, 打印, 打印
- 10:那是什么?
- 11:提問
- 12:提示別人
- 13:參數, 解包, 變量
- 14:提示和傳遞
- 15:讀文件
- 16:讀寫文件
- 17:更多文件操作
- 18:命名, 變量, 代碼, 函數
- 19:函數和變量
- 20:函數和文件
- 21:函數的返回值
- 22:到目前為止你學到了什么?
- 23:閱讀代碼
- 24:更多的練習
- 25:更多更多的練習
- 26:恭喜你,可以進行一次考試了
- 27:記住邏輯
- 28:布爾表達式
- 29:IF 語句
- 30:Else 和 If
- 31:做出決定
- 32:循環和列表
- 33:while循環
- 34:訪問列表元素
- 35:分支和函數
- 36:設計和調試
- 37:復習符號
- 38:列表操作
- 39:字典,可愛的字典
- 40:模塊, 類和對象
- 41:學會說面向對象
- 42:對象、類、以及從屬關系
- 43:基本的面向對象的分析和設計
- 44:繼承Vs.包含
- 45:你來制作一個游戲
- 46:項目骨架
- 47:自動化測試
- 48:更復雜的用戶輸入
- 49:寫代碼語句
- 50:你的第一個網站
- 51:從瀏覽器獲取輸入
- 52:開始你的web游戲
- 來自老程序員的建議
- 下一步
- 附錄A:命令行教程
- 簡介
- 安裝和準備
- 路徑, 文件夾, 名錄 (pwd)
- 如果你迷路了
- 創建一個路徑 (mkdir)
- 改變當前路徑 (cd)
- 列出當前路徑 (ls)
- 刪除路徑 (rmdir)
- 目錄切換(pushd, popd)
- 生成一個空文件(Touch, New-Item)
- 復制文件 (cp)
- 移動文件 (mv)
- 查看文件 (less, MORE)
- 輸出文件 (cat)
- 刪除文件 (rm)
- 退出命令行 (exit)
- 下一步