2019-07-08 文件操做的補充

1、其餘模式補充spa

  以前學的r(只能讀)/w(只能寫)/a(只能寫)3d

  今天學的:code

  r+/w+/a+(都變成讀寫模式)blog

with open(r'test',mode='r+',encoding='utf-8') as f:
    print(f.readable())
    print(f.writable())
    print(f.readline())
    f.write('嘿嘿嘿')



with open(r'test',mode='w+',encoding='utf-8') as f:
    print(f.readable())
    print(f.writable())
    print(f.readline())
    f.write('嘿嘿嘿')


with open(r'test',mode='a+b') as f:
    print(f.readable())
    print(f.writable())

2、文件內光標移動 內存

  test文件utf-8

f.seek(offset,whence)
offset:相對偏移量 光標移動的位數
whence:
0:參照文件的開頭 t和b均可以使用
1:參照光標所在的當前位置 只能在b模式下用
2:參照文件的末尾 只能在b模式下使用

  注意:在rt模式下,read內的數字  表示的是字符的個數(read(5) 表示讀取五個字符)除此以外,數字表示的都是字節rem

     rb模式下,read內的數字表示的是字節數(注意:並且三個字節表示一個漢字,一個字節表示一個英文,若是在讀漢字的時候,必定要是3的倍數,在轉成漢字的時候纔不會報錯。字符串

  seek參數爲0的時候:(光標在文件的開頭)it

with open(r'test','rt',encoding='utf-8') as f:
    print(f.read(1))   #rt模式數字1表明一個字符    #我
    f.seek(6,0)  # seek移動都是字節數,0表明把光標移動到開頭,6表明移動6個字節
    print(f.read(1))  #讀取一個字符     #讓


with open(r'test','rb') as f:
    print(f.read(3).decode('utf-8'))   #rb模式,read讀的是字節   #我
    f.seek(6,0)    #seek移動6個字節
    print(f.read(3).decode('utf-8'))    #

  seek參數爲1,2的時候:(只能在b模式下使用)for循環

with open(r'test','rb') as f:
    print(f.read(3).decode('utf-8'))   #rb模式下,數字表明字節   #我
    f.seek(3,1)            #數字1表明光標在當前位置
    print(f.read(6).decode('utf-8'))    #讀6個字節     #讓你

with open(r'test','rb') as f:
    print(f.read())    #rb模式讀取所有
    f.seek(-6,2)       #數字2表明光標在最後,-6表明光標往前走6個字節
    print(f.read().decode('utf-8'))   #光標在倒數6個字節前面讀取全部文件

  前面的都是seek光標讀取,咱們還能夠寫入,用r+模式  

with open(r'test','r+',encoding='utf-8') as f:
    f.seek(3,0)    #光標從開頭數3個字節
    f.write('')    #在‘我’後面加上'過'

  作一個文件內容更改檢測:(另一個程序對文件test01.txt加入一行文字,每次加入的文字光標都會在最後)

先運行檢測文件內容,讓循環一直開着,如今光標在文件最後面,而後運行寫入操做,文件寫入一行,被循環捕捉到內容打印出來,由於文件寫入是a追加模式,因此光標放在最後面。
輸入新內容又被循環捕捉到打印出來,這樣一直循環。
with open(r'test01.txt','rb') as f:
    f.seek(0,2)    # 先將光標移動到文件末尾
    while True:
        res = f.readline()    #讀取剛剛文件新加入的一行
        # 查看光標移動了多少位 bytes
        # print(f.tell())
        if res:
            print("新增的文件內容:%s"%res.decode('utf-8'))

  截斷文件操做:(注意:參數填的是字節數)

with open(r'test','a',encoding='utf-8') as f:
    f.truncate(6)  # 接收的字節的長度 整型
    # 保留0~6字節數 後面的所有刪除(截斷)

3、修改文件

  第一種方法:在同一個文件中操做(注意:在同一個with下面不能讀又寫同一個文件

#操做步驟
#1.先將數據讀取到內存中(讀文件)
#2.在內存中進行修改(字符串的替換)
#3.再覆蓋原文件(寫文件)

with open(r'test02.txt','r',encoding='utf-8') as f:
    data = f.read()   #讀取文件全部內容
    print(data)
    print(type(data))

with open(r'test02.txt','w',encoding='utf-8') as f:
    res = data.replace('egon','jason')   #修改內容
    print(data)
    f.write(res)   #從新寫入文件,由於是w模式,把以前的內容都清空了
優勢:任意時間硬盤上只有一個文件 不會佔用過多硬盤空間
缺點:當文件過大的狀況下,可能會形成內存溢出

  第二種方法:不在同一個文件中操做(建立一個新文件,把老文件刪除

#操做步驟
#1.新建一個新文件
#2.把老文件的內容讀取出來,修改內容,放在新文件中
#3.刪掉老文件
import os
with open(r
'test02.txt','r',encoding='utf-8') as read_f,\ open(r'test02.swap','a',encoding='utf-8') as write_f: for line in read_f: new_line = line.replace('jason','egon') write_f.write(new_line) os.remove('test02.txt') #刪掉這個文件 os.rename('test02.swap','test02.txt') #把test02.swap替換成test02.txt
優勢:內存中始終只有一行內容 不佔內存
缺點:再某一時刻硬盤上會同時存在兩個文件

 讀取文件的時候也能夠用for循環讀出每一行的內容

相關文章
相關標籤/搜索