Python文件修改和常用方法


  為了更好地說明接下來的文件修改操作,我們有必要先來學習下文件操作的常用方法。

一、文件處理中的常用方法 

#!/usr/bin/env python3 #-*- coding:utf-8 -*- # write by congcong

# flush() 把文件從內存強制刷新到硬盤
f = open('w_flush.txt',mode='r+') f.write("這是強制刷新到硬盤的文件!") f.flush() print("查看文件:",f.read()) # f.close()


# readable() 判斷是否可讀
print(f.readable())  #輸出:True
f1 = open("w_flush.txt",mode='w') #文件的寫操作
f1.write('判斷文件是否可讀!') f1.flush() print(f1.readable()) # 輸出:False (表明寫操作時文件也是不可讀的)


# readline() 輸出一行,碰到\r 或者 \n結束
f = open('w_flush.txt',mode='a',encoding='gbk') f.write('我是第一行!') f.write('\n我是第二行!') f = open('w_flush.txt',mode='r',encoding='gbk') print(f.readline())#輸出:我是第一行!

# tell() 返回光標當前位置,以字節為計算單位
print(f.tell()) #輸出 ; 14,因為編碼為 gbk ,gbk每個中文字符占兩個字節,所以此時光標位於第一行末尾

# seek() 將光標移到指定字節位置,以字節為計數單位
print(f.seek(2)) #輸出:2
print(f.readline()) # 輸出;是第一行!
print(f.seek(4))  #輸出:4
print(f.readline()) #輸出:第一行

# seekable() 判斷文件能否seek,linux中使用(一切皆文件)

# read() 括號內指定長度時,就從當前位置開始讀幾個字符;括號內沒有指定長度時,就讀全部文件,以字符為單位
print(f.tell()) print(f.seek(0)) print(f.read(2)) #輸出:我是

# truncate() 按指定長度截斷文件,括號內指定長度時,就從文件開頭開始截斷指定長度;不指定長度時,從當前位置到尾部的內容全部去掉 #此方法必須是在寫模式下使用
f = open('w_flush.txt','r+',encoding='gbk') print(f.seek(4)) #輸出;4
print(f.tell())  # 輸出;4
print(f.truncate(8)) #輸出;8
print(f.seek(0)) #輸出 :0
 f.close()

  了解了以上的方法,我們就能愉快地進行文件修改操作了。

二、文件修改操作

  當我們以讀寫(r+)模式打開文件時,,默認會把新增的內容追加到文件最末尾。

  這是為什么呢?那我們如果想要修改中間的內容該怎么辦呢?

  還記得我們剛學過一個tell()方法嗎,它的單位是字節,當我們讀一段內容的時候,光標會跟着移動,文件讀完了,光標就會移到末尾,

再接着寫,光標自然會跟着移動,寫完后,光標就停留在末尾了,我們可以用tell()方法驗證一下猜想,打印此時光標位置,

此時,我們再想讀文件內容,就沒有任何輸出了,都是空白的。這就解釋了為何我追加的內容為何無法讀出來。

  至於為何追加內容會從末尾開始,就容易理解了,當你以追加模式打開文件時,光標會默認移到文件尾部,再開始寫。

  而文件修改就要用到另一個方法了,seek()方法,它的作用就是移動光標到指定位置,移動的單位是字節,當我們想修改某個地方,

使用seek()方法將光標移到指定位置就可以再修改了,下面我們可以試一下:

# write.txt的原本內容是 :這是第一個我用Python寫的文件! # 現在我要將‘寫’改為‘修改后’
 f = open(file='write.txt',mode='r+',encoding='gbk') print('修改前:\n',f.read(),f.tell()) # 讀出修改前的文件內容,並打印當前光標位置
f.seek(20)          # 將光標移到第20個字節后的位置(GBK編碼一個漢字占2字節,英文占1字節)
f.write('修改后')     # 寫入修改內容
f.seek(0)           # 將光標移到文件開頭
print(f.tell())     # 打印當前光標位置
print('修改后:\n',f.read(),f.tell()) # 讀出修改后的文件內容,並打印當前光標位置
 f.close() # 關閉文件

''' 這是第一個我用Python寫的文件! 29 0 修改后: 這是第一個我用Python修改后件! 29 '''

  沒有報錯,正常執行,‘寫’ 也的確被改成了 ‘修改后’ ,文件大小也並未改變,但是也有我們不想修改的內容被覆蓋了,這就尷尬了。。。

  原因在這里

    這是硬盤的存儲原理導致的,當你把文件存到硬盤上,就在硬盤上划了一塊空間,存數據,等你下次打開這個文件 ,seek到一個位置,每改一個字,就是把原來的覆蓋掉,如果要插入,是不可能的,因為后面的數據在硬盤上不會整體向后移。所以就出現 當前這個情況 ,你想插入,卻變成了會把舊內容覆蓋掉。

  解決方法呢?

    想修改當然可以,但是不要在硬盤上修改,把內容全部讀到內存里,數據在內存里可以隨便增刪改查,修改之后,把內容再全部寫回硬盤,把原來的數據全部覆蓋掉。

    例如: 

# -*- coding:utf-8 -*-

import os       # 導入模塊
 f1 = 'notebook.txt'    # 待修改的文件
f2 = 'note_new.txt'    # 修改后的文件
f_old = open(f1,mode='r',encoding='utf-8')   # 打開待修改的文件
f_new = open(f2,mode='w',encoding='utf-8')    # 寫入修改的文件 
 old_str = ''       # 待修改的字符串
new_str = 'one'    # 修改后的字符串
count = 0           # 統計修改次數
for line in f_old:   # 循環讀
    if old_str in line: newline = line.replace('','one')    # 替換
        count += 1    # 每修改一次自增1
    else: newline = line f_new.write(newline) # 寫入修改后的文件
f_old.close()     # 依次關閉
f_new.close() os.replace('note_new.txt','notebook.txt')    # 用新文件里的內容替換舊文件 
print('修改次數:'count)     # 修改次數:5

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM