檔案開啟模式高階

2022-01-11 21:53:28 字數 3250 閱讀 1929

# wt

with open('36w.txt', 'wt', encoding='utf-8') as fw:

print(fw.readable())

print(fw.writable())

false

true

# w+t

with open('36w.txt', 'w+t', encoding='utf-8') as fw:

print(fw.readable())

print(fw.writable())

true

true

# r+t

with open('36w.txt', 'r+t', encoding='utf-8') as fr:

print(fr.readable())

print(fr.writable())

true

true

假設我們需要在檔案內容中間的某一行增加內容,如果使用基礎的r/w/a模式實現是非常困難的,因此我們需要對檔案內的指標進行移動。

with open('36r.txt', 'r+t', encoding='utf-8') as fr:

fr.readline()

fr.write('nick 真衰呀') # 寫在檔案的最後一行

硬碟上從來沒有修改一說,硬碟上只有覆蓋,即新內容覆蓋新內容。

1.seek(offset,whence): offset代表檔案指標的偏移量,偏移量的單位是位元組個數

# seek()

with open('36r.txt', 'rb') as fr:

print(f"fr.seek(4, 0): ") # 0相當於檔案頭開始;1相當於當前檔案所在位置;2相當於檔案末尾

# fr.seek(0,2) # 切換到檔案末尾

fr.seek(4, 0): 3

2.tell(): 每次統計都是從檔案開頭到當前指標所在位置

# tell()

with open('36r.txt', 'rb') as fr:

fr.seek(4, 0)

print(f"fr.tell(): ")

fr.tell(): 4

3.read(n): 只有在模式下的read(n),n代表的是字元個數,除此之外,其他但凡涉及檔案指標的都是位元組個數

# read()

with open('36r.txt', 'rt', encoding='utf-8') as fr:

print(f"fr.read(3): ")

fr.read(3): sdf

4.truncate(n): truncate(n)是截斷檔案,所以檔案的開啟方式必須可寫,但是不能用w或w+等方式開啟,因為那樣直接清空檔案了,所以truncate()要在r+或a或a+等模式下測試效果。它的參照物永遠是檔案頭。並且truncate()不加引數,相當於清空檔案。

# truncate()

with open('36r.txt', 'ab') as fr:

fr.truncate(2) # 截斷2個位元組後的所有字元,如果3個位元組乙個字元,只能截斷2/3個字元,還會遺留1/3個字元,會造成亂碼

檔案的資料是存放於硬碟上的,因而只存在覆蓋、不存在修改這麼一說,我們平時看到的修改檔案,都是模擬出來的效果,具體的說有兩種實現方式。

將硬碟存放的該檔案的內容全部載入到記憶體,在記憶體中是可以修改的,修改完畢後,再由記憶體覆蓋到硬碟(word,vim,nodpad++等編輯器)。

import os

with open('37r.txt') as fr, \

open('37r_swap.txt', 'w') as fw:

data = fr.read() # 全部讀入記憶體,如果檔案很大,會很卡

data = data.replace('tank', 'tanksb') # 在記憶體中完成修改

fw.write(data) # 新檔案一次性寫入原檔案內容

# 刪除原檔案

os.remove('37r.txt')

# 重新命名新檔名為原檔名

os.rename('37r_swap.txt', '37r.txt')

print('done...')

done...

將硬碟存放的該檔案的內容一行一行地讀入記憶體,修改完畢就寫入新檔案,最後用新檔案覆蓋原始檔。

import os

with open('37r.txt') as fr,\

open('37r_swap.txt', 'w') as fw:

# 迴圈讀取檔案內容,逐行修改

for line in fr:

line = line.replace('jason', 'jasonsb')

# 新檔案寫入原檔案修改後內容

fw.write(line)

os.remove('37r.txt')

os.rename('37r_swap.txt', '37r.txt')

print('done...')

done...
總而言之,修改檔案內容的思路為:以讀的方式開啟原檔案,以寫的方式開啟乙個新的檔案,把原檔案的內容進行修改,然後寫入新檔案,之後利用os模組的方法,把原檔案刪除,重新命名新檔案為原檔名,達到以假亂真的目的。

為啥要有返回值:

現在有乙個需求,比較兩個人的月薪,然後想獲取月薪較大人的年薪。

如果需要在程式中拿到函式的處理結果做進一步的處理,則需要函式必須要有返回值。

需要注意的是:

linux檔案開啟模式

檔案開啟 int open const char pathname int flags mode t mode 普通方式 canonical mode flags中沒有設定o sync and o direct。這種方式中read是阻塞呼叫 blocking call 等到磁碟資料讀取完畢後返回 w...

linux檔案開啟模式

檔案開啟 int open const char pathname int flags mode t mode 普通方式 canonical mode flags中沒有設定o sync and o direct。這樣的方式中read是堵塞呼叫 blocking call 等到磁碟資料讀取完成後返回 ...

檔案的開啟模式

1.ofstream 寫資料 ifstream 讀資料 fstream ofstream ifstream 建立fstream物件時,應指定檔案開啟模式 mode 模式 description 描述 ios in 開啟檔案讀資料 ios out 開啟檔案寫資料 ios ate 開啟檔案,把檔案游標移...