文件處理流程:python
在 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
打開文件後得到文件對象,利用文件對象的一些方法,咱們能夠對文件內容進行讀取或修改。視頻
文件對象方法 | 說明 |
---|---|
read([n]) | 讀取文件(所有讀取),以本身爲單位讀取 |
readable() | 判斷文件是否可讀,返回布爾值 |
readline() | 一次讀取一行,默認換行,f.readline(),end='' 不換行 |
readlines() | 讀取全部內容,存成列表 |
write(str) | 將字符串寫入文件 |
writeable() | 判斷文件是否可寫 |
writelines(seq) | 寫入一個序列,元素必須是字符串 |
seek(offset,from) | 在文件中移動文件指針 |
tell() | 返回當前在文件中的位置 |
close() | 關閉文件 |
使用 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]) # 只寫入第一行
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 爲三種模式:
從文件開始位置偏移:
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 表示沒有最後一行沒有讀完,再將偏移量翻倍
寫入文件必須是 w 或 a 模式打開文件,只能寫入字符串,不能寫入其餘數據類型。
w 模式打開文件,文件存在則覆蓋原有內容,文件不存在則新建。a 模式打開文件,文件追加到文件末尾:
f = open('a.txt', 'w', encoding='utf-8') f.write('123\n') # 要加換行 f.writelines(['45\n', '67\n']) # 寫入一個列表
+
表示同時能夠對文件進行讀寫操做。
模式 | 說明 | 模式 | 說明 |
---|---|---|---|
r+ | 讀寫 | w+ | 讀寫 |
x+ | 寫讀 | a+ | 寫讀 |
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 末尾則是在末尾追加。
f.closed():判斷文件是否關閉 f.encoding:查看文件打開的編碼 f.flush():刷新(每過幾秒自動保存)從內存到硬盤
open 函數打開文件六種模式r、r+、w、w+、a、a+
的區別: