Day23:檔案操作

書和咖啡發表於2019-02-25

在python中對於檔案操作就是讀和寫操作,而訪問檔案的模式有兩種,文字模式和二級制模式。

1.檔案開啟

# 現建立一個hello.txt檔案,然後加入內容hello world
f = open(file='./hello.txt')
result = f.read()
print(result )  #輸出: hello world
f.close()
  • 開啟檔案會用到open()函式,語法為:open(name[,mode[,buffering]]);

  • open函式()的檔名是必須的,而模式和緩衝引數都是可選的;

open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
  • buffering:是指緩衝大小,-1表示預設大小4096,0表示關閉緩衝區, encoding表示編碼方式,None表示預設的編碼方式;
  • errors:表示編碼錯誤被捕獲,如果是errors=ignore,那麼出現編碼錯誤將會被忽略;
  • newline:表示檔案換行的意思;
  • closefd:表示是否關閉檔案時同時關閉檔案描述符;

2.mode模式引數常用值有哪些

  • 'r':只讀;

  • 'w':只寫,從開頭開始寫,所以會覆蓋檔案的內容;

  • 'a':追加,不會覆蓋檔案內容;

  • 'x':只寫,如果檔案不存在則建立檔案,以只寫方式開啟檔案,保護寫;

  • 'b':二進位制;

  • 't':文字,是預設的模式,可以不寫,一般都是以文字模式開啟檔案;

  • '+':讀寫;

  • 'r+':給只讀賦予寫的能力;

  • 'w+':給只寫賦予只讀的能力,因為是以只寫的形式開啟檔案,會清空檔案內容,所以不能讀取到內容,只是有了讀的功能;

3.檔案讀取

f = open(file='./hello.txt',mode='w')
result = f.read()
print(result) # hello world

f.write('a')  # 如果寫入則會報錯,因為此時是隻讀模式
#
result1 = f.read(3)  # 表示檔案讀三個位元組,不給值表示直接讀到EOF
print(result1) # hel

f.close() # 讀取完檔案一定要關閉
  • 讀取檔案會用到read()函式,用於從檔案中讀取指定的字元數,如果未給定或為負值則表示讀取所有字元;

  • 如果檔案非常大,尤其是大於記憶體時,無法使用read()方法;

4.檔案寫入

  • wxa都是隻寫,t模式是字元流,按照字元編碼理解,b是位元組流,位元組操作是bytes型別;
  • + 無法單獨使用,用來增強rwxa等功能,但是在獲取檔案物件是依然是本身的特性;
 # w為只寫模式
f = open(file='./hello.txt', mode='w')
f.write('a')
f.read() # 此時讀就會報錯
f.close()

# x是隻寫,檔案不存在,建立檔案,以只寫方式開啟
f = open('./test.txt', 'x')
# f.read() # 此時讀會報錯
f.write('a')
f.close()

# a只寫,檔案存在,追加內容,檔案不存在,只寫,追加內容
f = open('./test1.txt', 'a')
# f.read() # 此時讀會報錯
f.write('aaa')
f.close()

5.檔案指標

f = open('hello.txt', 'r+')
print(f.tell()) # 檔案的起始位置 0
print(f.read()) # 讀檔案所有的內容
print(f.tell()) # EOF,也就是最後一個字元是幾
print(f.seek(3)) # 偏移兩個位元組
print(f.read())
f.close()

f = open('test.txt', 'rb+')
print(f.tell()) # 檔案的起始位置0
print(f.read()) # 讀檔案所有的內容
print(f.tell()) # EOF,也就是最後一個字元
print(f.seek(2)) # 偏移兩個位元組
print(f.read())

f.write(b'ni hao')
f.seek(2,2) # 二級制模式下,seek(offset, whence=0) 可以給whence傳遞1, 2 或 0, 0表示檔案從頭開始, 1表示從當前位置開始,2表示從檔案末尾EOF開始
f.seek(1,1)
f.write(b'ni hao')
f.flush() # 將快取重新整理到檔案
f.write(b'ni hao')
f.close() # 檔案控制程式碼關閉的時候,會將快取重新整理到檔案

  • mode為r的時候,指標的起始點在0;

  • mode為a的時候,指標的起始點在EOF,檔案末尾;

  • tell()函式:顯示指標的當前位置;

  • seek()函式:移動檔案指標的位置,引數offset指的是偏移的位元組;

  • flush()函式:將快取重新整理到檔案;

  • close()函式:關閉檔案;

6.檔案行讀取

import io
f = open('hello.txt', 'r+')
print(io.DEFAULT_BUFFER_SIZE) # 8192
print(f.readline(), '第一行')  # 讀取一行
print(f.readline(), '第二行')
print(f.readlines())          # 讀取所有行,且返回列表
  • readline() 函式用於從檔案讀取整行(包括 “\n” 字元),如果指定了一個非負數的引數,則返回指定大小的位元組數(包括 “\n” 字元);

  • readlines() 函式用於讀取所有行,且返回值為列表形式;

7.open 檔案上下文管理器

with open('test.txt',mode='w') as f:
    f.write('nihao')
  • 使用with 關鍵字來實現上下文管理器;

  • 通過上下文管理的方式開啟檔案,在檔案末尾會自動執行關閉語句,不需要寫f.close()來關閉檔案了;

參考:俠課島(9xkd.com)Python同學計劃