題目
上一題的加分練習中有讓我們查看 file 的幫助文檔,雖然 python3 中已經沒有 file 這個東西了,不過我們通過 help()
知道了被 open
打開後的這個東西是什麼以及它的幫助文檔,如果大家有大概看過應該有見過下面的幾個方法(函數),請記住它們:
- close —— 關閉文件。如同編輯器中
文件 -> 保存
的作用。 - read —— 讀取文件內容。可以把結果賦值給一個變量。
- readline —— 讀取文本文件中的一行內容。
- truncate(size) —— 將文件截斷指定 size 字節,size 後的內容將刪除請小心使用。
- writer(something) —— 把 something 寫入文件。
本題將練習寫入文件 writer
的使用。
加分練習
- 如果覺的自己沒弄懂的話,就用老辦法,個每一行加註釋。至少能知道哪一行沒懂。
- 寫一個和 15 題類似的腳本,使用
read
和argv
讀取由 基礎練習 所創建的那個文本文件。 - 文件中重複的地方太多了,試着用一個
target.write()
將line1
,line2
,line3
打印出來,可以使用字符串、格式化字符、轉義字符。 - 找出爲什麼我們需要給
open
多賦予一個w
參數。
我的答案
16.0 基礎練習 + 16.1註釋
from sys import argv
# 通過解包 argv 獲取 腳本名 和將要保存的 文件名
script, filename = argv
# 詢問是否繼續編輯文件 filename
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("?")
# 如果用戶未輸入 ctrl-c 則會繼續執行
print("Opening the file...")
# 打開文件對象
target = open(filename, 'w')
# 沒有指定 truncate() 的大小,所有實際上刪除了文件的內容
print("Truncating the file. Goodbye!")
target.truncate()
# 獲取三個 input 變量的內容
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 there 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()
運行以一下腳本
可以在腳本所在文件價內發現新建的文檔 test.txt 打開後其內容正如我們輸入的三行內容。
16.2 寫一個讀取腳本
# 要求用 argv 方式,所有相見載入
from sys import argv
# 解包
script, filename = argv
print("腳本 %r 正在讀取文件: %r ..." % (script, filename))
# 打開文件
file_open = open(filename)
# 用 print 打印出讀取到的內容
print(file_open.read())
運行一下
16.3 優化腳本
# 太羅嗦了 16.3 題優化掉
# target.write(line1)
# target.write("\n")
# target.write(line2)
# target.write("\n")
# target.write(line3)
# target.write("\n")
nl = '\n'
target.write(line1 + nl + line2 + nl + line3 + nl )
16.4 open 爲什麼多了一個 w
參數
open()
的默認參數是 open(file, 'rt')
也就是讀取文本的模式,默認參數可以不用填寫。而本題練習是寫入文件,因此不適應使用 r
參數,需要指定寫入模式,因此需要增加 w
參數。