Python中文件的讀寫操作


文件操作基本流程:

1. 介紹

計算機系統是由計算機硬件,操作系統,和應用程序三部分組成.

內存 存放不持久

硬盤 可以使數據持久化

文件操作  數據持久化的一種

全棧開發  框架類

2. 文件的操作流程

打開文件, 得到文件句柄並賦值給變量
f = open("a.txt","r",encoding="utf-8")
通過句柄對文件操作 data=f.read()
關閉 文件
f.close()

只讀操作(**r, **rb)

f = open("護士少婦嫩模.txt",mode="r",encoding="utf-8")

content = f.read()

print(content)

f.close()

rb 讀出來的數據是bytes類型,在rb模式下,不能選擇encoding.

rb的作用:在讀取非文本文件的時候. 比如圖片,MP3,視頻等就需要用到rb.因為這種數據沒辦法直接顯示出來.

f = open("護士少婦嫩模.txt",mode="rb")

content=f.read()

print(content)

f.close()

讀取文件的方法:

read() 是將文件中所有的內容讀出來

read(n) 是讀取n個字符.

比如:  友誼地久天長

read(3)  結果就是  "友誼地"  把前三個字讀出來. 需要注意的是,如果再次讀取, 會在當前位置繼續往后讀,而不是從頭開始讀.  例如,再來一個read(3) 得到的結果就是 "久天長"

如果是rb模式, 就是讀3個字節

readline() 一次讀取一行數據. 注意:每次讀取出來的數據都會有一個換行符 \n, 我們要使用strip()方法去掉\n

readlines()將一行形成一個元素,放到一個列表中. 占內存  不推薦使用.

 

*** 循環讀取, 每次讀一行內容. 不會產生內存溢出

f = open("a.txt",mode="r",encoding="utf-8")

for line in f:

  print(line.strip())

f.close()     一定要注意關閉

 

寫模式(**w,wb)

寫的時候,如果沒有文件,就會先創建文件; 如果文件存在就會將原來的內容先刪除, 再寫入新的內容.

f = open("小娃娃.txt",mode="w",encoding="utf-8")

f.write("金毛獅王")

f.flush() #刷新

f.close()

wb模式: 可以不指定打開文件的編碼,但是在寫入文件的時候必須把字符轉換成"utf-8"

 

f = open("小娃娃.txt",mode="wb")

f.write("金毛獅王", encoding("utf-8"))

f.flush() #刷新

f.close()

 

追加(**a,ab)

在追加的模式下,寫入的內容會追加在文件的結尾

f = open("小娃娃",mode="a",encoding="utf-8")

f.write("馬化騰")

f.flush()

f.close()

讀寫模式(**r+, r+b)

讀寫模式必須是先讀. 因為默認光標在開頭,讀完之后再寫入. r+模式是以后使用頻率最高的.

f = open("小娃娃",mode="r+",encoding="utf-8")

content = f.read()

f.write("馬化騰的汽車") #會接着原來的內容繼續往后寫,沒有換行

print(content)

f.flush()

f.close()

寫讀模式(w+, w+b )

先將所有的內容清空,然后寫入,最后讀取. 但是讀取的內容是空的. 不常用.

追加讀(a+)

a+模式下,不論是先讀還是后讀,都讀取不到數據. 

追加都是在最后的位置,先讀的話,后面沒內容,讀不出來, 如果寫完再讀,光標還是在最后 ,還是讀不到內容.

 

***其他操作

1. **seek()     seek(n)光標移動到n位置,注意,移動的單位是byte,如果是utf-8中文部分要是3的倍數

**移動到開頭: seek(0)

移動到結尾: seek(0,2) seek的第二個參數表示的是從哪個位置進行偏移,默認是0,表示開頭, 1表示當前位置, 2表示結尾

f = open("小娃娃",mode="r+",encoding="utf-8")
f.seek(0) #光標移動到開頭
content = f.read() #讀取內容,此時光標移動到結尾
print(content)
f.seek(0) #再次將光標移動到開頭
f.seek(0,2) #將光標移動到結尾
content2 = f.read() #讀取內容, 什么都沒有
print(content2)

f.seek(0) # 移動到開頭
f.write("張國榮") #寫入信息 會把之前有的信息覆蓋掉. ,此時光標在9, 中文3*3個=9
f.flush()
f.close()

2. tell() 幫忙找到當前光標的位置

f = open("小娃娃",mode="r+",encoding="utf-8")
f.seek(0) #光標移動到開頭
content = f.read() #讀取內容,此時光標移動到結尾
print(content)
f.seek(0) #再次將光標移動到開頭
f.seek(0,2) #將光標移動到結尾
content2 = f.read() #讀取內容  什么都沒有
print(content2)

f.seek(0) #移動到開頭
f.write("張國榮") #寫入信息,此時光標在9

print(f.tell())  #光標位置9
f.flush()
f.close()

3. truncate()截斷文件

 

#truncate() 截斷文件
f = open("小娃娃",mode="w",encoding="utf-8")
f.write("哈哈") #寫入2個字符
f.seek(3) #光標移動到3, 也就是兩個字的中間
f.truncate() #刪除光標后面的所有內容
f.close()

 

f = open("小娃娃",mode="r+",encoding="utf-8")
content=f.read(3) #讀取12個字符
f.seek(4) #移動4個byte
print(f.tell())
f.truncate()#后面的所有內容全部刪除
f.flush()
f.close()

注意:在r+模式下,如果讀取了內容,不論讀取多少,光標顯示的是多少,再寫入或者其他操作文件的時候, 都是在結尾進行的.

 

***修改文件

文件修改:只能將文件中的內容讀取到內存中,將信息修改完畢,然后將源文件刪除,將新文件名修改成老文件名

 

##文件修改
import os
with open("小娃娃",mode="r",encoding="utf-8") as f1,\
    open("小娃娃_new",mode="w",encoding="utf-8") as f2:
    content = f1.read()
    new_content = content.replace("冰糖葫蘆","大白梨")
    f2.write(new_content)
os.remove("小娃娃")  #刪除源文件
os.rename("小娃娃_new","小娃娃") #重新命名新文件

 

弊端:一次將所有內容讀出來,內存溢出. 可以一行一行讀取.

import os
with open("小娃娃",mode="r",encoding="utf-8") as f1,\
    open("小娃娃_new",mode="w",encoding="utf-8") as f2:
    
    for line in f1:
        new_line = line.replace("冰糖葫蘆","大白梨") f2.write(new_line)

os.remove(
"小娃娃") #刪除源文件 os.rename("小娃娃_new","小娃娃") #重新命名新文件

 


免責聲明!

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



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