一、文件操作基本步驟
1.打開文件的兩種方式
變量名 = open('需打開的文件','模式選擇',encoding='編碼類型')
with open('需打開的文件','模式選擇',encoding='編碼類型') as 變量名:
將文件的關閉交給with管理,當with中邏輯結束後,系統會自動釋放文件,不必進行close()。
2.操作文件(模式彙總)
主模式:
- r: 讀
- w: 寫(無創建,有清空)
- a: 追加(有創建的功能)
從模式:
- t: 文本操作(默認模式) r=>rt w=>wt a=>at
- b: 非文本文件必須採用二進制模式來處理
- +: 可讀可寫
組合:
- r+: 不會創建文件的可讀可寫
- w+:創建並清空文件的可讀可寫
- a+:創建不清空文件(追加)的可讀可寫
- rb: 二進制讀
- wb:創建清空文件的二進制寫
- ab: 創建不清空文件(追加)的二進制寫
- rb+ :不會創建文件的二進制可讀可寫
- wb+:創建並清空文件的二進制可讀可寫
- ab+:創建不清空文件(追加)的二進制可讀可寫
打入冷宮
- x:寫模式,創建文件,如果文件已存在,就報錯
- U:棄用
3.關閉文件
f.close()
二、文件操作模式進階
1.追加寫入
newline 讀取一個字節,如果是行/文件等結束標識,返回該標識,否則返回None
(1)藉助讀寫,完成追加
with open('1.txt', 'rt', encoding='utf-8') as f1:
data = f1.read()
data += '666'
with open('1.txt', 'wt', encoding='utf-8') as f2:
f2.write(data)
(2)a爲寫模式,在原數據後追加寫入新數據
with open('1.txt', 'a', encoding='utf-8') as f:
f.write('777')
2.文件複製
(1)文本類型文件的複製
r = open('1.txt','r',encoding='utf-8')
w = open('11.txt','w',encoding='utf-8')
for line in r: # 遍歷就是一行一行讀,讀取文件的流
w.write(line)
w.flush
w.close()
r.close()
2.先讀後寫複製(用with方法)
with open('1.txt','r',encoding='utf-8') as r,open('11.txt','w',encoding='utf-8') as w:
for line in r:
w.write(line)
w.flush
3.邊讀邊寫複製
with open('sourse.txt','r',encoding='utf-8') as f1:
with open('target.txt','w+',encoding='utf-8') as f2:
for line in f1:
f2.write(line)
(2)非文本文件複製
從模式採用b模式,不需要關心編碼問題。
# 圖片複製
with open('001.png','rb') as f1:
with open('100.png','wb+') as f2:
for line in f1:
f2.write(line) # 同理視頻複製如此,只是文件後綴名不同。
遊標操作
1.如何使用遊標:遊標的相關方法
方法:seek(偏移量, 偏移位置)
偏移量:移動的字節數,負數是結合模式1,2往前偏移
偏移位置:
- 0 - 從文件開始位置開始偏移
- 1 - 從當前遊標位置開始偏移
- 2 - 從文件末尾開始偏移
2.遊標相關的讀寫操作
b'你好1234567890'
with open('source.txt', 'rb') as f:
d1 = f.read(11)
print(d1)
# print(d1.decode('utf-8'))
當前遊標的位置
print(f.tell())
遊標操作 - 從末尾位置開始
f.seek(-3, 2)
d2 = f.read()
print(d2.decode('utf-8')) # 890
遊標操作 - 從當前位置開始
f.seek(-3, 1)
d2 = f.read()
print(d2.decode('utf-8')) # 34567890
遊標操作 - 從頭開始
f.seek(3, 0)
d2 = f.read()
print(d2)
print(d2.decode('utf-8')) # 好1234567890
3.遊標寫:會覆蓋書寫
with open('source.txt', 'rb+') as f:
f.seek(11)
# print(f.read())
f.write(b'000')
案例:百度雲盤秒傳模擬
百度——秒傳 真實數據在服務器,10000個人擁有同一個文件,百度只需存一個
在大文件中,開頭,1/3 處, 2/3處以及末尾各取10個字節拼接成秒傳的信息依據
形成秒傳規則
tagData = b''
with open('001.png', 'rb') as f:
# 通過其他途徑(sys模塊)來獲取文件總大小
data = f.read()
length = len(data)
# 開頭
f.seek(0, 0)
d1 = f.read(10)
# 1/3
f.seek(length // 3, 0)
d2 = f.read(10)
# 2/3
f.seek(length // 3 * 2, 0)
d3 = f.read(10)
# 末尾
f.seek(-10, 2)
d4 = f.read(10)
tagData = d1 + d2 + d3 + d4
秒傳依據
print(tagData)
newData = b""
with open('001.png', 'rb') as f:
data = f.read()
length = len(data)
f.seek(0, 0)
newData += f.read(10)
f.seek(length // 3, 0)
newData += f.read(10)
f.seek(length // 3 * 2, 0)
newData += f.read(10)
f.seek(-10, 2)
newData += f.read(10)
if newData == tagData:
print('秒傳成功')
else:
print('慢慢傳去吧')