Python開發【第六篇】:文件處理

1. 文件

  文件處理流程:python

  • 打開文件,得到文件句柄,並賦值
  • 經過句柄對文件進行操做
  • 關閉文件

1.1 打開文件

  在 Python 中使用 open()函數打開文件,並返回文件對象:函數

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

  open 函數有不少參數,通常地只需瞭解三個便可。第一個是文件對象,第二個是打開模式,第四個是編碼方式編碼

Tips:open 函數打開文件採用的默認編碼方式是系統編碼,Windows 爲 GBK;若打開的文件是 utf-8,那麼須要指定編碼方式爲 utf-8,不然亂碼。指針

文件打開模式
打開模式 說明
r 只讀方式打開(默認)
x 若是文件存在,打開引起異常
b 以二進制方式打開文件
+ 可讀寫模式(可添加到其餘模式中)
w 只寫方式打開,會覆蓋已存在文件
a 以寫入模式打開,文件存在,在末尾追加
t 以文本模式打開(默認)
U 通用換行符支持

  使用 open 函數打開一個文件,能夠得到文件對象(或句柄),利用文件對象,咱們就能夠對文件進行讀取或 修改操做:日誌

f = open('C:\\Users\\HJ\\Desktop\\a.txt')

Tips:open 函數默認以只讀模式打開文本文件,即 rt 模式,打開二進制須要 b 模式。code

1.1.1 文件對象方法

  打開文件後得到文件對象,利用文件對象的一些方法,咱們能夠對文件內容進行讀取或修改。視頻

文件對象方法
文件對象方法 說明
read([n]) 讀取文件(所有讀取),以本身爲單位讀取
readable() 判斷文件是否可讀,返回布爾值
readline() 一次讀取一行,默認換行,f.readline(),end=''不換行
readlines() 讀取全部內容,存成列表
write(str) 將字符串寫入文件
writeable() 判斷文件是否可寫
writelines(seq) 寫入一個序列,元素必須是字符串
seek(offset,from) 在文件中移動文件指針
tell() 返回當前在文件中的位置
close() 關閉文件

1.1.2 with 關鍵字

  使用 open 函數打開文件,每次都須要關閉文件,非常麻煩。一旦沒有關閉,文件就會有泄漏的風險。而 Python 爲咱們提供了一個關鍵字 with,不須要咱們每次本身關閉文件,Python 內部會自動關閉。對象

with open('a.txt') as f:        # f 即爲文件對象
    f.read()

  打開一個文件,並將內容寫入另外一個文件中:blog

with open('a.txt', 'r', encoding='utf-8') as f1,
     open('b.txt', 'w', encoding='utf-8') as f2:
        data = f1.readlines()   # 存爲列表
        f2.write(data[0])       # 只寫入第一行

1.1.3 文件定位

  tell()方法圖片

  read 方法以 字節讀取文件,不指定參數,默認所有讀取,文件指針指向文件末尾。使用 tell 方法能夠查看文件指針位置。

# test_file.txt
第一行
第二行
f = open('test_file',  encoding='utf-8', newline='')
data = f.readlines()
print(f.tell())
print(data)
f.close()

22
['第一行\r\n', '第二行\r\n']

  文件默認不顯示 \r\n,每一個漢字 3 個字節,總共 6 個漢字(即 18 個字節)。再加上兩個 \r\n(即 4 個字節),總計 22 個字節,顯然文件指針已經指向文件末尾。

Tips:在不一樣系統中換行符不一樣,Windows 中爲 \r\n,Linux 中爲\n。Python 爲了更好地兼容其餘平臺,統一轉換爲 \n,要想查看真實的換行符,可在 open 函數中指定 newline = ''

  默認不顯示換行符:

f = open('test_file',  encoding='utf-8')
print(f.read())
print(f.tell())

第一行
第二行
22

  使用 readlines()只能看到 \n

f = open('test_file',  encoding='utf-8')
print(f.readlines())
print(f.tell)   

['第一行\n', '第二行\n']
22

  seek()方法

  文件指針即用來定位光標所在,至關於一個書籤,seek()方法能夠用來設置文件指針的位置,它的單位也是 字節

seek(offset, from)
seek(3)     # 移動 3 個字節

  seek()有兩個參數:第一個 offset 爲偏移量(即偏移字節),第二個 from 表示從哪一個位置開始偏移,from 爲三種模式:

  • 0:表示從文件開頭位置偏移
  • 1:表示從當前位置偏移,必須以 rb 模式打開,最後再解碼
  • 2:表示從文件末尾開始偏移,必須以 rb 模式打開,最後再解碼

  從文件開始位置偏移:

f = open('test_file',  encoding='utf-8')
print(f.tell())         # 文件剛打開時位置爲 0
f.seek(10, 0)           # 偏移 10 個字節,即第一行 \r 的後面,那麼剩下的還要 \n 和 第二行內容
print(f.tell())         
print(f.read())
f.close()

0
10

第二行

  從當前位置偏移:

f = open('test_file', 'rb')
f.seek(3, 0)        # 移動 3 個字節
print(f.tell())      # 3 位置
f.seek(3, 1)            # 在 3 位置,再移動 3 個字節
print(f.tell())
print(f.read().decode('utf-8'))
f.close()

3
6
行
第二行

  首先移動 3 個字節,再移動 3 個字節,指針到了第一行內容(第一行)中一的後面,再讀取後面的內容。

  文件末尾偏移:

f = open('test_file', 'rb')
f.seek(-5, 2)
print(f.tell())
data = f.readlines()
print(data)
print(data[-1].decode('utf-8'))
f.close()

17
[b'\xe8\xa1\x8c\r\n']       # 二進制,須要解碼
行

  訪問文件的兩種方式

  設置一個查看日誌的程序(查看日誌通常都是查看最新的,即文件最後位置的內容)。

  方法一:

  使用 readlines()方法查看,缺點是須要所有將文件讀取出來,加載到內存才能讀取最後一行,消耗時間和內存。

f = open('a.txt', encoding='utf-8')
data = f.readlines()
print(data[-1])

  方法二:

  利用 seek()方法,將文件指針移動到文件末尾,從文件末尾開始讀取。

f = open('a.txt', 'rb')
for i in f:
    offs = -10
    while True:
        f.seek(offs, 2)
        data = f.readlines()
        if len(data) > 1:           # 大於 1 表示讀了兩行
            print('文件最後一行是:%s' % (data[-1]).decode('utf-8'))
            break
        offs *= 2       # 小於 1 表示沒有最後一行沒有讀完,再將偏移量翻倍

1.2 文件寫入

  寫入文件必須是 w 或 a 模式打開文件,只能寫入字符串,不能寫入其餘數據類型。

1.2.1 w、a 模式

  w 模式打開文件,文件存在則覆蓋原有內容,文件不存在則新建。a 模式打開文件,文件追加到文件末尾:

f = open('a.txt', 'w', encoding='utf-8')
f.write('123\n')        # 要加換行
f.writelines(['45\n', '67\n'])      # 寫入一個列表

1.2.2 + 模式

  +表示同時能夠對文件進行讀寫操做。

模式 說明 模式 說明
r+ 讀寫 w+ 讀寫
x+ 寫讀 a+ 寫讀

1.2.3 b 模式

  b 模式以字節爲單位打開文件,便可打開二進制文件(包括視頻、圖片、音頻等),打開時不能指定編碼方式。

  一個文件在未保存時,它是存在於內存中(字符串形式)。當要存儲到硬盤上時,便須要編碼成字節碼(bytes),同理硬盤上的內容加載處理,須要解碼(decode)成字符串(str):

# a.txt
第一行
f = open('test_file', 'rb')
data = f.read()
print(data)
print(data.decode('utf-8'))

b'\xe7\xac\xac\xe4\xb8\x80\xe8\xa1\x8c\r\n\r\n'
第一行

  wb 、ab模式

  以二進制格式寫入文件,會覆蓋原文件。只能寫入二進制文件,所以寫入的字符串必須編碼成二進制。

f = open('a.txt', 'wb')
f.write(bytes('你好\n', encoding='utf-8'))
#f.write('你好\n'。encode('utf-8'))

  以上兩種方式均可以寫入文件,ab 末尾則是在末尾追加。

1.2.4 其餘文件對象方法

f.closed():判斷文件是否關閉
f.encoding:查看文件打開的編碼
f.flush():刷新(每過幾秒自動保存)從內存到硬盤

1.3 總結

  open 函數打開文件六種模式r、r+、w、w+、a、a+的區別:

  • r:只讀
  • r+:可讀寫,直接寫入文件,則從文件開頭開始寫,覆蓋原有內容。若先讀後寫則在文件末尾追加。
  • w:只寫,覆蓋文件內容,文件不存在則新建
  • w+:可讀寫,若是文件存在,則覆蓋整個文件內容。不存在則新建。
  • a:只寫,從文件末尾追加內容,文件不存在則新建
  • a+:可讀寫,從文件開頭讀取內容,從文件末尾添加內容
相關文章
相關標籤/搜索