- 本教程為python3文檔解讀
- 本教程面向完全型小白,只要你會在電腦上打字,那你就可以看懂。
- 參考視頻觀看,味道更加:https://space.bilibili.com/186584185/#!/video
- 建議優先閱讀本系列的《編程的本質》這一章節。
- 推薦閱讀:《跟我讀python3文檔:016_帶你手撕程序,展現一個函數如何從思路到實現》
貫穿始終的理念:別廢話,就是干!
往期回顧:
- 匿名函數lambda
- 列表推導式
- 數據結構
- 模塊
文檔解讀
python3文檔第七小節鏈接地址:7.2. Reading and Writing Files
本章主要講解7.2. Reading and Writing Files(讀寫文件)這個小節
作者:咖喱py
文件讀寫這部分相對好理解一些,就是:
- 打開文件 ?? 讀文件 ?? 關閉文件
- 打開文件 ?? 寫文件 ?? 關閉文件
我們把這三部分分開講:
第一部分:打開文件
這一部分會略帶一點讀寫文件的內容。
讀文件就是用讀模式打開文件,用讀方法讀取文件;
寫文件就是用寫模式打開文件,用寫方法寫入文件。
關鍵詞就是:模式、方法
注意:讀和寫,是分開的兩件事情!
接下來我們來看這兩件事情的異同之處。
>>> f = open('workfile', 'w')
- open( )函數打開文件,
- 函數的第一個字符串參數代表文件,
- 函數的第二個字符串參數代表模式,例如讀或寫,常見的有如下模式字母:
字母 | 模式意義 |
---|---|
'r' | 讀取文件 |
'w' | 寫入文件,如果文件存在,則替換文件 |
'a' | 續寫文件 |
'b' | 二進制模式,常與其他字母組合使用 |
其他模式字母請參考文檔:模式字母
有些模式可以相互組合,比如:
- 在模式后面加上b模式,可以進行二進制數據處理
- 加上+(加號),代表我們可以對文件進行讀和寫
可能+(加號)那里你有點不理解他的意思。因為你還沒有明白,“讀和寫是兩件事”是什么意思。
我們繼續往下看例子,你很快就能明白。
寫入文件:
- 在寫模式下,用寫方法,即write( )方法
>>> a = open('test.py', 'w') #用寫模式打開文件,把文件對象賦值給a。
>>> a.write('This is the entire file.\n') #用write()方法寫入文件
25 #打印出寫入的字符數量
讀取文件:
- 在讀模式下,用讀方法,即read( )方法
>>> b = open('test.py', 'r') #用讀模式打開文件,把文件對象賦值給b。
>>> b.read() #用read()方法讀文件
'This is the entire file.\n' #文件內容被打印出來
下面來體驗一下什么叫做:讀和寫是兩件事
在讀模式下,用write( )方法
>>> c = open('test.py', 'r') #用讀模式打開文件,把文件對象賦值給c。
>>> c.write('galipy') #嘗試在讀模式中,寫入內容。
Traceback (most recent call last): #程序出錯
File "<stdin>", line 1, in <module>
io.UnsupportedOperation: not writable
注意報錯的最后一句話,寫明了不支持寫入操作。
也就是說,我們在讀模式,就只能讀取文件,不能寫入文件。
在寫模式,就只能寫入文件,不能讀取文件。
現在明白“讀和寫是兩件事”是什么意思了吧。
相當于,如果你以讀模式打開文件,那就只能讀取文件;如果還想要寫入文件,就只能用寫模式再打開一遍文件。
那么有沒有什么辦法可以簡化一下這個步驟呢?
答案就是:添加+(加號)模式。
>>> c = open('test.py', 'r+') #用讀模式與加號模式打開文件,把文件對象賦值給c。
>>> c.write('galipy') #嘗試在讀模式中,寫入內容。
6 #返回寫入的字符數量
第二部分:讀寫文件
這部分其實是講讀寫文件的細節的
我們在進行讀或寫操作時,一定要時刻明白自己是從哪里讀,讀到哪了?從哪里寫,寫在哪了?
你可能會天真的理解為從頭讀,從頭寫。
但實際情況可能和你想的不太一樣。
長者怎么說的來著?
圖樣圖森破~
讀文件
#假設你有一個test.py文件,里面只寫了一句話:'This is the entire file.'
#現在我們要讀取它
>>> b = open('test.py', 'r') #用讀模式打開文件,把文件對象賦值給b。
>>> b.read() #用read()方法讀文件
'This is the entire file.\n' #文件內容被打印出來
#如果我們再次調用read()方法會怎么樣?它會從哪開始讀?還是從頭嗎?
>>> b.read()
''
#是不是沒有得到你想要的結果?
現在明白這個從哪讀到底是從哪讀了嗎?
當你第一次啟動read( )方法時,它的確是從頭開始讀的,但是當你第二次調用read( )方法時,它是接著上一次調用開始讀的。
write( )方法也是一樣。如果你連續調用,那么他會連續接著寫。
這樣有什么好處呢?這樣可以讓我們一次只讀取一部分,然后接著讀下一部分。
比如你有一個50G的文件,但你的電腦就2G內存,你要怎么辦呢?如果你直接一次性打開,估計你的電腦就死機了。。。所以,我們需要分多次讀取。
>>> c.read(20) #一次讀取20個字符,然后多次調用
分次讀取還有一些其他的方法,比如:
c.readline() #一次讀取一行
或者
>>> for a_line in c: #用循環遍歷的方法一次讀取一行
... print(a_line, end='')
...
This is the first line of the file.
Second line of the file
如果你想要讀取文件中所有的行,你也可以使用 list(f) 或 f.readlines()。
寫文件
一開始我們已經接觸過寫文件了,那么它有哪些需要注意的呢?
關鍵點在于write( )方法的參數!
這個參數必須是一個字符串!
也就是說,我們只能往文件里寫入字符串類型!
不能是整數類型,不能是列表類型,不能是其他任何類型!
一定要記住write()方法的參數是字符串類型這一點,因為我們在講解json時,還會用到這點。
>>> a = open('test.py', 'w') #用寫模式打開文件,把文件對象賦值給a。
>>> a.write('This is the entire file.\n') #用write()方法寫入文件
25 #打印出寫入的字符數量
要想寫入其他類型,我們也需要先把它們轉化為字符串類型在寫入
>>> value = ('the answer', 42)
>>> s = str(value) #把元組類型轉化為字符串類型了
>>> f.write(s)
18
讀寫文件的主要細節就這些,不過還有一些拓展方法值得學習:
- tell()方法
查看讀取到的位置 - seek(offset, from_what)方法
設置讀取位置
具體使用方法,請自行學習~
第三部分:關閉文件
為了保證文件內容的正確性,同時,為了節約內存的使用,我們每次對文件進行完操作之后都要關閉文件。
>>> a = open('test.py', 'w') #用寫模式打開文件,把文件對象賦值給a。
>>> a.write('本文作者是咖喱py.\n') #用write()方法寫入文件
11
>>> a.close() #用close()方法關閉文件
但是,一般情況下,我們的文件操作都是通過腳本文件執行的。一旦程序運行出錯,我們的close()操作可能就無法執行。
為了保證close()正確執行,于是我們就要用到try和finally兩個關鍵字。
注意!從現在開始,我們要寫腳本文件了,不再只是在交互模式里過家家了。
新建腳本firstFile.py
輸入如下內容:
myfile = open('test.py','r')
try:
for line in myfile: #注意縮進關系
print(line, end='')
finally:
my file.close()
文件會執行try語句塊中的內容,不論此語句塊中的內容能不能成功運行,程序最后都會去執行finally語句塊中的內容。
這樣就可以保證close()這個關閉操作100%運行了。
但是,就像我最開始那期的文章里介紹的,程序猿都是懶惰的,每次都輸入那么多很麻煩。
下面給出精簡辦法,用with、as關鍵字:
with open('test.py','r') as myfile:
for line in myfile:
print(line, end='')
這三行代碼和上面的六行代碼做的是相同的事情。只不過有些操作被隱藏了起來。
參考著上面的try、finally語句塊,試試自己理解with、as語句塊發生了什么~
by_ 咖喱py
今天就講到這里吧~
記住write( )方法的參數特點喲~下期講解json將會用到~
最近發現文章被盜的很兇,而且還不署名。。。
你們的良心不會痛嘛~