Python3之檔案操作file

geek_xiong發表於2018-09-04

檔案file

什麼是檔案:

  • 檔案是用於資料儲存的單位
  • 檔案通常用來長期儲存資料
  • 檔案中的資料是以位元組為單位進行儲存的

檔案的操作流程:

  1. 開啟檔案
  2. 讀/寫檔案
  3. 關閉檔案
    注意:任何作業系統,一個應用程式同時開啟檔案的數量有最大數限制
    檔案一般流程:
f = open(filename, 'xxx')  # 開啟檔案
'''這裡是讀寫操作'''
f.close()  # 關閉檔案

mode模組字元的含義:

字元 含義
‘r’ 以只讀方式開啟(預設)
‘w’ 以只寫方式開啟,刪除原有檔案內容(如果檔案不存在,則建立該檔案並以只寫方式開啟)
‘x’ 建立一個新檔案, 並以寫模式開啟這個檔案,如果檔案存在則會產生”FileExistsError”錯誤
‘a’ 以只寫檔案開啟一個檔案,如果有原檔案則追加到檔案末尾
‘b’ 用二進位制模式開啟
‘t’ 文字檔案模式開啟 (預設)
‘+’ 為更新內容開啟一個磁碟檔案 (可讀可寫)

- 預設是’rt’
- ‘w+b’ 可以實現二進位制隨機讀寫,當檔案開啟時,檔案內容被清空
- ‘r+b’ 以二進位制讀和更新模式開啟檔案,開啟檔案時不會清空檔案內容
- ‘r+’ 以文字模式讀和更新模式開啟檔案,開啟檔案時不會清空檔案內容

python在檔案常用的方法:

方法 說明
F.close() 關閉檔案(關閉後檔案不能再讀寫會發生ValueError錯誤)
F.readline() 讀取一行資料, 如果到達檔案尾則返回空行
F.readlines(max_chars=-1) 返回每行字串的列表,max_chars為最大字元(或位元組)數
F.writelines(lines) 將字串的列表或字串的列表中的內容寫入檔案
二進位制檔案操作方法
F.read(size=-1) 從一個檔案流中最多讀取size個字元(文字檔案)或位元組(二進位制檔案),如果不給出引數,則預設讀取檔案中全部的內容並返回
F.write(text) 寫一個字串到檔案流中,返回寫入的字元數(文字檔案)或位元組數(二進位制檔案)
F.tell() 返回當前檔案流讀寫指標的絕對位置(位元組為單位)
F.seek(offset, whence=0) 改變資料流讀寫指標的位置,返回新的絕對位置
F.flush() 把寫入檔案物件的快取內容寫入到磁碟

檔案的讀操作:

read:讀取檔案的全部內容並原樣輸出

如,當前有檔案myfile.txt:
這裡寫圖片描述

f = open('myfile.txt')
res = f.read()
print(res)
f.close()

輸出結果是:
這裡寫圖片描述

f = open('myfile.txt')
res = f.read(3)
print(res)
f.close()

read可以設定讀取字元數:
如:

f = open('myfile.txt')
res = f.read(3)
print(res)
f.close()

列印結果:

你好!

readline:讀取檔案的一行內容,以換行符 ’ \n ’ 分割

還是以上檔案myfile.txt

f = open('myfile.txt')
res = f.readline()
print(res)
f.close()

輸出結果:

/usr/bin/python3.5 /home/.../myfile.py
你好! 我在檔案裡

readlines:讀取檔案的全部內容,以換行符 ’ \n ’ 分割存在列表中

還是以上檔案myfile.txt

f = open('myfile.txt')
res = f.readlines()
print(res)
f.close()

輸出結果:

/usr/bin/python3.5 /home/.../myfile.py
['你好! 我在檔案裡\n', '你好! 我在檔案裡\n', '你好! 我在檔案裡\n', '你好! 我在檔案裡 gh\n', '\n', '你好! 我在檔案裡\n']

以readlines讀取的檔案內容是可迭代物件,可以使用for迴圈遍歷,或直接示意索引下標獲取想要的內容

檔案的二進位制讀取:

現在改了myfile的內容如下:
你好!
aaa

現在以二進位制的形式將這兩行文字讀取出來

f = open('myfile.txt', 'rb')  # 開啟方式使用'rb'
res = f.read()
print(res)
f.close()

結果是:

b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x81\naaa\n'

檔案的寫操作

write (text) : 將字串寫入到檔案當中

f = open('newfile.txt', 'w')  # w :有則開啟並覆蓋原內容,沒有則新建檔案
s = 'dfjhg\nhdgf'  # \n 會被解析成換行符
f.write(s)
f.close()

檔案內容:

dfjhg
hdgf

writelines:將列表或列表的內容寫入到檔案(只能是字串)


f = open('newfile.txt', 'w') 
L = ['sadf', 'sdf\n', '324\n']  # \n 被解析
f.writelines(L)
f.close()

檔案內容:

sadfsdf
324

我們輸一個不是字串型別的試試:

L = ['sadf', 'sdf\n', '324\n'True]  # 把上述列表改成這個

結果出現錯誤:

Traceback (most recent call last):
  File "/home/.../file_write_text.py", line 3, in <module>
    f.writelines(L)
TypeError: write() argument must be str, not bool

錯誤提示大概是這樣的:寫的內容必須是字串型別,而不是布林型別

以二進位制的形式寫入檔案

f = open('newfile.txt', 'wb')   # 使用 wb
L = [b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x81\naaa\n']  # \n 被解析
f.writelines(L)
f.close()

檔案內容:

你好!
aaa

也可以使用write寫。

檔案的一些其他操作

flush:強制將快取區的內容寫入檔案

有時候寫著寫著檔案突然斷電等,讓寫操作斷開了,這時沒有寫完的就會放入緩衝區裡,可以使用flush強制寫入檔案,具體寫法如下:

f.write()
f.flush()  # 直接在寫後邊加這一句話即可

tell:返回當前檔案流的讀寫位置(從0開始,以位元組為單位)

try:
    f = open('mynote.txt', 'rt')

    b = f.read(3)
    print(b)
    print('當前的位置是:', f.tell())
    f.close()
except OSError:
    print('開啟二進位制檔案失敗')

列印結果:

bbb
當前的位置是: 3

seek:設定檔案的讀寫位置

語法格式:f.seek(偏移量,whence=相對位置)
偏移量:大於0代表向檔案尾方向移動,小於0代表向檔案頭移動
相對位置:
0—–>代表從檔案頭開始偏移
1—–>代表從檔案當前位置開始偏移
2—–>代表從檔案尾開始偏移

如有myfile.txt,內容是:abcdeABCDE1234567890

f = open('myfile.txt', 'rb')
b = f.read(3)  # 讀取 3 個字元
print(b)

f.seek(5, 0)  # 0 從檔案頭開始移動,5 表示向尾移動,偏移量大小為 5,即開始從‘A’讀
c = f.read(5)  # 讀 5 個字元
print(c)

f.seek(2, 1)  # 1 表示從當前位置移動,2 表示向尾移動,偏移量大小為 2 ,即從 ‘3’ 開始讀
d = f.read(5)  # 向尾讀取 5 個字元
print(d)

f.seek(-15, 2)  # 2 表示從尾開始移動,-15 表示向檔案頭移動,偏移量大小為 15,即從'A'開始讀
e = f.read(5)
print(e)

f.close()

執行結果:

b'abc'
b'ABCDE'
b'34567'
b'ABCDE'

本節完

相關文章