04-Python文件操作

打開文件

f=open("我的文件.txt","r",encoding="utf8")  #打開一個文件(讀模式)
f.close()  #關閉文件

解釋:

  • 參數1:文件路徑和文件名
  • 參數2:打開模式,r表示read讀
  • encoding指定文件編碼爲UTF-8
  • 最後不要忘記關閉文件

with語句

寫代碼過程中,很容易忘記關閉文件,所以出現了with語句

with open("我的文件.txt","r",encoding="utf8") as file:  #自動關閉文件
    data=file.read()    #讀取文件
    print(data)

解釋:

  • 這種方式會自動關閉文件(防止忘記)
  • 一旦離開了with語句塊,就會自動關閉文件
  • 操作文件的對象爲變量file
同時打開多個文件:
with open("123.txt","w") as f1,open("456.txt","w") as f2:
    f1.write("Hello 123.txt\n")
    f2.write("Hello 456.txt\n")

讀寫模式

什麼是光標?

操作系統使用光標來讀寫文件
光標的位置影響讀寫的位置

常用模式
r	#讀模式
w	#寫模式,會清空文件
a	#追加模式

r+讀寫模式:
    根據光標位置讀寫

w+寫讀模式:
    會清空文件
    根據光標位置讀寫

a+追加模式:
    不會清空文件
    打開文件之後自動將光標置於最後,而光標位置只會影響讀操作
    每一次追加都會將光標置於最後

rb、wb、ab……:
    以bytes類型讀取文件

示例:

下例中的讀寫模式爲r (read讀模式)

f=open("我的文件.txt","r",encoding="utf8")

讀操作

方法:

data = file.read()   # 讀取文件全部信息(不建議,非常佔用內存)
data = file.read(5)  # 讀取5個字符

示例:

with open("我的文件.txt","r",encoding="utf8") as file:
    data = file.read()  # 讀取文件全部信息(不建議,非常佔用內存)
    print(data)         # 輸出文件內容

寫操作

示例:

with open("我的文件.txt","w",encoding="utf8") as file:
    file.write("Hello World")  # 寫操作(只是寫到緩衝區中)
    file.flush()  # 將緩衝區裏的內容寫到文件中

解釋:

w模式會清空文件
write()函數會將數據寫入緩衝區,而不是文件中
flush()函數和關閉文件時,python會將緩衝區中的數據寫入文件。

爲什麼不直接寫入文件?

文件存儲在磁盤中,如果每一次寫入文件都要訪問一次磁盤,就會頻繁請求磁盤,導致磁盤壓力過大。


內置函數

with open("我的文件.txt","r",encoding="utf8") as file:
    data=file.readline()   #輸出當前行(光標會移動到下一行)
    data=file.readlines()  #返回一個列表,元素爲各行(不使用迭代器)
    location=file.tell()   #返回當前光標位置。按字節返回(一箇中文佔3個字節)
    file.seek(5)     #設置光標位置

    num=file.fileno()  #返回文件句柄,唯一標識該文件對象
                        #兩個程序對同一個文件同時調用,得到的句柄相同
    print(num)

重點:

  • readlines()會讀取文件所有內容,如果文件很大則佔用內存。
  • 所以大文件不建議使用readlines()
truncate()截斷
num=file.truncate() #截斷,刪除光標後所有字符,返回光標位置
file.truncate(5)    #保留文件開頭5個字符,剩下的刪除

示例:

with open("我的文件.txt","w",encoding="utf8") as file:
    file.write("1234567890")
    file.flush()
    file.seek(5)
    num=file.truncate()    #文件內容爲12345
    print(num)             #結果爲5

遍歷文件

with open(“我的文件.txt”,“r”,encoding=“utf8”) as file:
    for i in file:
        print(i)  # 使用生成器,不佔用內存(所以不要使用readlines()方法)

解釋器:

  • 遍歷文件:依次讀取文件全部內容(這裏按行讀取)
  • 生成器:每一行依次讀取到內存中,而不是全部讀取到內存中
  • 不建議使用realines(),特別是讀取大文件

將變量值保存在文件中

如何將變量值寫入文件中?

  • 思路:

將變量轉換爲字符串,再寫入文件
讀取文件後,再將字符串轉換爲原類型

方法1:eval方式

eval函數可以將字符串類型的數據轉換爲原來的類型。
如:將字符串'{"姓名":"張三"}'轉換爲字典{"姓名":"張三"}

示例:

a={'湖南':{'永州':'寧遠'}}
a=str(a)   #將a強制轉換成字符串(就可以方便寫入文件中了)
print(type(a))    #輸出:<class 'str'>
a=eval(a)  #讀取文件後,將a轉換回原來的類型
print(type(a))    #輸出:<class 'dict'>
方法2:json方式
import json
a={'江蘇':{'鎮江':'京口區'}}
data=json.dumps(a)    #轉換成json格式 (str類型)
data=json.loads(data)  #轉回原格式

解釋:

  • json方式缺點:不可轉換對象
  • json方式優點:語言之間通用(可被其他語言解析)
方法3:pickle方式
import pickle
a={'江蘇':{'鎮江':'京口區'}}
data=pickle.dumps(a)   #轉換成pickle格式 (str類型)
data=pickle.loads(data)    #轉回原格式

解釋:

  • pickle方式優點:可以轉換所有類型
  • pickle方式缺點:只能在Python中使用
  • 注意:要用rb和wb方式讀寫文件,因爲pickle會將變量轉換爲bytes類型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章