基石爲勤能補拙的迷宮之旅——第八天(Python文件操作)

一、文件操作基本步驟

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('慢慢傳去吧')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章