打開文件
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類型