1. 程式人生 > 實用技巧 >檔案處理的開啟方式、操作方法、指標的移動、修改方法

檔案處理的開啟方式、操作方法、指標的移動、修改方法

一、檔案處理的開啟模式

控制檔案讀寫操作的模式:

檔案控制代碼 = open('檔案路徑', '模式')

1. 開啟檔案的模式有(預設為文字模式):

r ,只讀模式【預設模式,檔案必須存在,不存在則丟擲異常】
w,只寫模式【不可讀;不存在則建立;存在則清空內容】
a, 之追加寫模式【不可讀;不存在則建立;存在則只追加內容】

2. 對於非文字檔案,我們只能使用b模式,"b"表示以位元組的方式操作(而所有檔案也都是以位元組的形式儲存的,使用這種模式無需考慮文字檔案的字元編碼、圖片檔案的jgp格式、視訊檔案的avi格式)

rb
wb
ab
注:以b方式開啟時,讀取到的內容是位元組型別,寫入時也需要提供位元組型別,不能指定編碼

3. 瞭解部分

"+" 表示可以同時讀寫某個檔案
r+, 讀寫【可讀,可寫】
w+,寫讀【可讀,可寫】
a+, 寫讀【可讀,可寫】

x, 只寫模式【不可讀;不存在則建立,存在則報錯】
x+ ,寫讀【可讀,可寫】
xb

二、操作檔案的方法:

掌握

f.read() #讀取所有內容,游標移動到檔案末尾
f.readline() #讀取一行內容,游標移動到第二行首部
f.readlines() #讀取每一行內容,存放於列表中

f.write('1111\n222\n') #針對文字模式的寫,需要自己寫換行符
f.write('1111\n222\n'.encode('utf-8')) #針對b模式的寫,需要自己寫換行符
f.writelines(['333\n','444\n']) #檔案模式
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式

瞭解

f.readable() #檔案是否可讀
f.writable() #檔案是否可讀
f.closed #檔案是否關閉
f.encoding #如果檔案開啟模式為b,則沒有該屬性
f.flush() #立刻將檔案內容從記憶體刷到硬碟
f.name

三、檔案內游標移動

1、read(3):

  1). 檔案開啟方式為文字模式時,代表讀取3個字元

  2). 檔案開啟方式為b模式時,代表讀取3個位元組

2、 其餘的檔案內游標移動都是以位元組為單位如seek,tell,truncate

注意:

1).seek有三種移動方式0,1,2,其中1和2必須在b模式下進行,但無論哪種模式,都是以bytes為單位移動的

主動控制指標移動
f.seek(移動的位元組個數,模式)
模式有三種:
0: 永遠參照檔案開頭
1:參照當前所在的位置#
2:永遠參照檔案末尾

  注意:只有0模式可以在t下使用,1和2只能在b模式下使用

with open('a.txt',mode='rt',encoding='utf-8') as f:
f.seek(3,0)
f.seek(5,0)
print(f.tell())

with open('a.txt',mode='rb') as f:
f.seek(3,1)
f.seek(5,1)
print(f.tell())
res=f.read()
print(res.decode('utf-8'))

with open('a.txt',mode='rb') as f:    
f.seek(-3,2)    
print(f.tell())    
f.seek(0,2)

2).truncate是截斷檔案,所以檔案的開啟方式必須可寫,但是不能用w或w+等方式開啟,因為那樣直接清空檔案了,所以truncate要在r+或a或a+等模式下測試效果

案例:
import time
with open('test.txt','rb') as f:
    f.seek(0,2)
    while True:
        line=f.readline()
        if line:
            print(line.decode('utf-8'))
        else:
            time.sleep(0.2)

四、檔案的修改

修改檔案的方式一:

1、先將檔案內容全部讀入記憶體

2、在記憶體中完成修改

3、將修改後的內容覆蓋回原檔案

import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    data=read_f.read() #全部讀入記憶體,如果檔案很大,會很卡
    data=data.replace('alex','SB') #在記憶體中完成修改

    write_f.write(data) #一次性寫入新檔案

os.remove('a.txt')
os.rename('.a.txt.swap','a.txt') 

p s: 耗費記憶體不耗費硬碟~~~

修改檔案的方式二:

1、以讀的方式開啟原檔案,然後以寫的方式開啟一個臨時檔案

2、讀原檔案的一行內容到記憶體,然後在記憶體中修改完畢後再寫入臨時檔案,迴圈往復直到全部改完

3、刪出原檔案,將臨時檔案重新命名為原檔名

import os

 with open('e.txt',mode='rt',encoding='utf-8') as src_f,open('.e.txt.swp',mode='wt',encoding='utf-8') as dst_f:
     for line in src_f:
         dst_f.write(line.replace('EGON','egon'))

 os.remove('e.txt')
 os.rename('.e.txt.swp','e.txt')

p s: 耗費硬碟不耗費記憶體

==建議使用方式二