日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

python以什么方式处理文件-Python文件修改和常用方法

發(fā)布時間:2025/3/12 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python以什么方式处理文件-Python文件修改和常用方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

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

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

#flush() 把文件從內(nèi)存強(qiáng)制刷新到硬盤

f = open("w_flush.txt",mode="r+")

f.write("這是強(qiáng)制刷新到硬盤的文件!")

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() 輸出一行,碰到 或者 結(jié)束

f = open("w_flush.txt",mode="a",encoding="gbk")

f.write("我是第一行!")

f.write(" 我是第二行!")

f= open("w_flush.txt",mode="r",encoding="gbk")print(f.readline())#輸出:我是第一行!

#tell() 返回光標(biāo)當(dāng)前位置,以字節(jié)為計算單位

print(f.tell()) #輸出 ; 14,因為編碼為 gbk ,gbk每個中文字符占兩個字節(jié),所以此時光標(biāo)位于第一行末尾

#seek() 將光標(biāo)移到指定字節(jié)位置,以字節(jié)為計數(shù)單位

print(f.seek(2)) #輸出:2

print(f.readline()) #輸出;是第一行!

print(f.seek(4)) #輸出:4

print(f.readline()) #輸出:第一行

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

#read() 括號內(nèi)指定長度時,就從當(dāng)前位置開始讀幾個字符;括號內(nèi)沒有指定長度時,就讀全部文件,以字符為單位

print(f.tell())print(f.seek(0))print(f.read(2)) #輸出:我是

#truncate() 按指定長度截斷文件,括號內(nèi)指定長度時,就從文件開頭開始截斷指定長度;不指定長度時,從當(dāng)前位置到尾部的內(nèi)容全部去掉#此方法必須是在寫模式下使用

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()

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

二、文件修改操作

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

這是為什么呢?那我們?nèi)绻胍薷闹虚g的內(nèi)容該怎么辦呢?

還記得我們剛學(xué)過一個tell()方法嗎,它的單位是字節(jié),當(dāng)我們讀一段內(nèi)容的時候,光標(biāo)會跟著移動,文件讀完了,光標(biāo)就會移到末尾,

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

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

至于為何追加內(nèi)容會從末尾開始,就容易理解了,當(dāng)你以追加模式打開文件時,光標(biāo)會默認(rèn)移到文件尾部,再開始寫。

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

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

#write.txt的原本內(nèi)容是 :這是第一個我用Python寫的文件!#現(xiàn)在我要將"寫’改為"修改后’

f= open(file="write.txt",mode="r+",encoding="gbk")print("修改前: ",f.read(),f.tell()) #讀出修改前的文件內(nèi)容,并打印當(dāng)前光標(biāo)位置

f.seek(20) #將光標(biāo)移到第20個字節(jié)后的位置(GBK編碼一個漢字占2字節(jié),英文占1字節(jié))

f.write("修改后") #寫入修改內(nèi)容

f.seek(0) #將光標(biāo)移到文件開頭

print(f.tell()) #打印當(dāng)前光標(biāo)位置

print("修改后: ",f.read(),f.tell()) #讀出修改后的文件內(nèi)容,并打印當(dāng)前光標(biāo)位置

f.close()#關(guān)閉文件

"""這是第一個我用Python寫的文件! 29

0

修改后:

這是第一個我用Python修改后件! 29"""

沒有報錯,正常執(zhí)行,"寫’ 也的確被改成了 "修改后’ ,文件大小也并未改變,但是也有我們不想修改的內(nèi)容被覆蓋了,這就尷尬了。。。

原因在這里:

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

解決方法呢?

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

例如:

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

import os #導(dǎo)入模塊

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 #統(tǒng)計修改次數(shù)

for line in f_old: #循環(huán)讀

if old_str inline:

newline= line.replace("一","one") #替換

count += 1 #每修改一次自增1

else:

newline=line

f_new.write(newline)#寫入修改后的文件

f_old.close() #依次關(guān)閉

f_new.close()

os.replace("note_new.txt","notebook.txt") #用新文件里的內(nèi)容替換舊文件

print("修改次數(shù):"count) #修改次數(shù):5

總結(jié)

以上是生活随笔為你收集整理的python以什么方式处理文件-Python文件修改和常用方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。