#20 Python文件

前言

前面幾節枯燥的模塊終於結束了,想要徹底掌握前幾節的模塊須要不斷的練習才行,畢竟眼過千遍不如手過一遍嘛。在一些項目需求裏,要對文件進行IO操做,畢竟重要數據不可能打印到屏幕上而不去保存,Python對的文件IO操做並非很複雜,相信你很快就能掌握它!python

文件IO操做

對於一個文件的操做,無非不過建立、刪除、讀、寫,建立和刪除在OS模塊裏面已經說過,那隻剩下讀和寫了,也就是IO(Input,Output)操做了。緩存

接下來,將以徐志摩的《再別康橋》爲例子,深刻解讀Python中文件IO操做函數

輕輕的我走了,
正如我輕輕的來;
我輕輕的招手,
道別西天的雲彩。
----
那河畔的金柳,
是夕陽中的新娘;
波光裏的豔影,
在個人心頭盪漾。
----
軟泥上的青荇,
油油的在水底招搖;
在康河的柔波里,
我甘心作一條水草!
----
那榆蔭下的一潭,
不是清泉,是天上虹;
揉碎在浮藻間,
沉澱着彩虹似的夢。
----
尋夢?撐一支長篙,
向青草更青處漫溯⑷;
滿載一船星輝,
在星輝斑斕裏放歌。
----
但我不能放歌,
悄悄是別離的笙簫;
夏蟲也爲我沉默,
沉默是今晚的康橋!
----
悄悄的我走了,
正如我悄悄的來;
我揮一揮衣袖,
不帶走一片雲彩。

1. 打開文件

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+                                           二進制追加讀

這些模式看似複雜,其實內部規律很清晰,接下來將用文件的讀和寫來充分了解這些模式指針

2. 文件的讀

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)
   ...:
輕輕的我走了,

正如我輕輕的來;

我輕輕的招手,

道別西天的雲彩。

----

那河畔的金柳,
(將後面的輸出省略了)

3. 文件的寫

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

4. 關閉文件

close()   「關閉文件,若是將寄存區有緩存則寫入文件」

In [48]: f.close()

5. 文件其餘方法

tell()  「返回當前文件指針位置」

seek(offset, whence=0) 「offset表明要設置的文件指針位置」

name  「返回當前文件名」

相關文章
相關標籤/搜索