前面幾節枯燥的模塊終於結束了,想要徹底掌握前幾節的模塊須要不斷的練習才行,畢竟眼過千遍不如手過一遍嘛。在一些項目需求裏,要對文件進行IO操做,畢竟重要數據不可能打印到屏幕上而不去保存,Python對的文件IO操做並非很複雜,相信你很快就能掌握它!python
對於一個文件的操做,無非不過建立、刪除、讀、寫,建立和刪除在OS模塊裏面已經說過,那隻剩下讀和寫了,也就是IO(Input,Output)操做了。緩存
接下來,將以徐志摩的《再別康橋》爲例子,深刻解讀Python中文件IO操做函數
輕輕的我走了, 正如我輕輕的來; 我輕輕的招手, 道別西天的雲彩。 ---- 那河畔的金柳, 是夕陽中的新娘; 波光裏的豔影, 在個人心頭盪漾。 ---- 軟泥上的青荇, 油油的在水底招搖; 在康河的柔波里, 我甘心作一條水草! ---- 那榆蔭下的一潭, 不是清泉,是天上虹; 揉碎在浮藻間, 沉澱着彩虹似的夢。 ---- 尋夢?撐一支長篙, 向青草更青處漫溯⑷; 滿載一船星輝, 在星輝斑斕裏放歌。 ---- 但我不能放歌, 悄悄是別離的笙簫; 夏蟲也爲我沉默, 沉默是今晚的康橋! ---- 悄悄的我走了, 正如我悄悄的來; 我揮一揮衣袖, 不帶走一片雲彩。
Python得到文件句柄的方式與c及其相似,使用內置函數open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) 「file表示文件名、mode表示打開方式(默認爲讀)、buffering表示寄存區緩衝大小(負值爲系統默認,0爲沒有寄存區緩存,1爲文件會寄存行,大於1的整數爲寄存區緩存大小)、encoding表示文件編碼、newline表示換行符(默認爲\n)」編碼
f = open('再別康橋.txt') # 以默認讀的方式打開再別康橋,注意:文件路徑(此時程序和再別康橋在同一路徑) f = open('xxx.txt', 'w') # 以寫的方式打開文件,注意:若是此文件不存在,則建立這個文件;若是存在,則刪除原文件全部內容
對於不一樣的文件,有不一樣的處理方式,經常使用的mode參數以下:spa
模式 描述 r 讀 w 寫 r+ 讀寫 w+ 寫讀 a 追加 a+ 追加讀 rb 二進制讀 wb 二進制寫 rb+ 二進制讀寫 wb+ 二進制寫讀 ab 二進制追加 ab+ 二進制追加讀
這些模式看似複雜,其實內部規律很清晰,接下來將用文件的讀和寫來充分了解這些模式指針
read() 「讀取文件指針以後的全部內容,並返回字符串」code
這裏提到了一個新概念:文件指針,想象一下,你在讀書,你的手指頭指着你正在讀的地方,你沒讀一個字,你的手指頭就跟着向後動一下,你的手指頭就是文件指針,以上模式中,除了a、a+、ab+文件指針在文件末尾以外,其餘的都是在文件開頭視頻
In [2]: f = open('再別康橋.txt') # 默認讀的方式打開文件 In [3]: f.read() # 讀取文件指針以後的全部內容 Out[3]: '輕輕的我走了,\n正如我輕輕的來;\n我輕輕的招手,\n道別西天的雲彩。\n----\n那河畔的金柳,\n是夕陽中的新娘;\n波光裏的豔影,\n在個人心頭盪漾。\n----\n軟泥上的青荇,\n油油的在水底招搖;\n在康河的柔波里,\n我甘心作一條水草!\n----\n那榆蔭下的一潭,\n不是清泉,是天上虹;\n揉碎在浮藻間,\n沉澱着彩虹似的夢。\n----\n尋夢?撐一支長篙,\n向青草更青處漫溯;\n滿載一船星輝,\n在星輝斑斕裏放歌。\n----\n但我不能放歌,\n悄悄是別離的笙簫;\n夏蟲也爲我沉默,\n沉默是今晚的康橋!\n----\n悄悄的我走了,\n正如我悄悄的來;\n我揮一揮衣袖,\n不帶走一片雲彩。\n'
In [9]: f = open('再別康橋.txt', 'w') # 以寫的模式打開文件,此時這個文件的內容已經被刪除了😰 In [10]: f.read() # 能夠看到文件是不容許讀的 --------------------------------------------------------------------------- UnsupportedOperation Traceback (most recent call last) <ipython-input-10-571e9fb02258> in <module> ----> 1 f.read() UnsupportedOperation: not readable
In [1]: f = open('test.jpg', 'rb') # 以二進制方式打開文件 In [2]: f.read() Out[2]: b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xff\xdb\x00C\x00\x05\x04\x04\x05\x04\x03\x05\x05\x04\x05\x06\x06\...........' # 有許多文件格式是以二進制保存的,最典型的就是圖片和視頻
readline() 「讀一行」對象
In [1]: f = open('再別康橋.txt') In [2]: f.readline() # 讀一行 Out[2]: '輕輕的我走了,\n' In [3]: f.readline() # 再讀一行 Out[3]: '正如我輕輕的來;\n' In [4]: f.readline() Out[4]: '我輕輕的招手,\n' In [5]: f.readline() Out[5]: '道別西天的雲彩。\n'
readlines() 「按行讀取文件,將全部的行保存爲一個列表」blog
In [6]: f = open('再別康橋.txt') In [7]: f.readlines() Out[7]: ['輕輕的我走了,\n', '正如我輕輕的來;\n', '我輕輕的招手,\n', '道別西天的雲彩。\n', '----\n', '那河畔的金柳,\n', '是夕陽中的新娘;\n', '波光裏的豔影,\n', '在個人心頭盪漾。\n', '----\n', '軟泥上的青荇,\n', '油油的在水底招搖;\n', '在康河的柔波里,\n', '我甘心作一條水草!\n', '----\n', '那榆蔭下的一潭,\n', '不是清泉,是天上虹;\n', '揉碎在浮藻間,\n', '沉澱着彩虹似的夢。\n', '----\n', '尋夢?撐一支長篙,\n', '向青草更青處漫溯⑷;\n', '滿載一船星輝,\n', '在星輝斑斕裏放歌。\n', '----\n', '但我不能放歌,\n', '悄悄是別離的笙簫;\n', '夏蟲也爲我沉默,\n', '沉默是今晚的康橋!\n', '----\n', '悄悄的我走了,\n', '正如我悄悄的來;\n', '我揮一揮衣袖,\n', '不帶走一片雲彩。\n']
文件迭代 「open函數打開一個文件後,這個句柄自己是可迭代對象」
In [8]: f = open('再別康橋.txt') In [9]: for line in f: # 直接迭代文件 ...: print(line) ...: 輕輕的我走了, 正如我輕輕的來; 我輕輕的招手, 道別西天的雲彩。 ---- 那河畔的金柳, (將後面的輸出省略了)
write(text) 「text表示要寫入文件的內容,並返回寫入的字符數」
In [13]: f = open('new_file.txt', 'w') # 以寫的方式打開文件,若是文件不存在則建立,若是存在則刪除原有內容 In [14]: f.write('hello') # 寫入hello Out[14]: 5 In [15]: f.write('word\n') # 寫入word並換行 Out[15]: 5
注意:若是這時候去查看文件內容,發現裏面仍是空蕩蕩的,爲何呢?由於寄存區緩存的緣由,默認是使用系統的寄存區緩存機制,想要馬上寫入文件能夠改變buffering的值,也可使用close()方法關閉文件(關閉文件時全部內容都會寫入文件)、再或者使用flush()方法當即將寄存區內容寫入文件
In [23]: f.flush() # 使用flush()方法當即刷入 In [24]: ! cat new_file.txt # 使用命令查看文件內容,文件內容有兩行,一行字,一行空白(由於使用\n換行了),這個是Linux系統命令🤥 helloword
In [25]: f = open('new_file.txt', 'a') # 以追加模式打開,若是文件存在則打開文件,若是不存在則新建文件 In [27]: f.write('i am new\n') Out[27]: 9 In [28]: f.flush() In [30]: ! cat new_file.txt helloword i am new
In [31]: f = open('new_file.txt', 'a') In [32]: f.read() # 追加方式是不容許讀的,w、wb、ab也不容許讀 --------------------------------------------------------------------------- UnsupportedOperation Traceback (most recent call last) <ipython-input-32-571e9fb02258> in <module> ----> 1 f.read() UnsupportedOperation: not readable
In [33]: f = open('new_file.txt', 'a+') # 使用追加讀的方式打開文件 In [34]: f.read() # 能夠讀,但爲何是空的?由於文件指針在末尾 Out[34]: '' In [36]: f.write('afd') # 也能夠寫 Out[36]: 3
writelines(lines) 「將一個列表或元組序列寫入文件,須要換行本身加」
In [39]: f = open('new_file.txt', 'w') In [43]: f.writelines(['hello','world']) # 將列表序列寫入文件 In [44]: f.writelines(('haha','hehe')) # 將元組序列寫入文件 In [45]: f.flush() # 刷入 In [46]: ! cat new_file.txt # 查看文件內容 helloworldhahahehe
close() 「關閉文件,若是將寄存區有緩存則寫入文件」
In [48]: f.close()
tell() 「返回當前文件指針位置」
seek(offset, whence=0) 「offset表明要設置的文件指針位置」
name 「返回當前文件名」