操做系統給用戶提供的操做硬盤的簡單接口python
永久保存數據編碼
相對路徑:a.txt # 必須與當前py文件在同一級目錄操作系統
絕對路徑:E:\Python\練習代碼\文件處理\a.txtcode
f = open('a.txt') f = open(r"E:\Python\練習代碼\文件處理\a.txt")# 注意須要要用r防止轉義 f.close()# 回收操做系統的資源
f:文件句柄接口
能夠同時打開多個文件,with未執行完前讀取文件讀不出內存
with open(r'th.jpg',mode='rb')as rf,open('lixiaoran.png',mode='wb')as wf: with open("a.txt") as f:# as 的做用是將賦值給f with open(r'E:\Python\練習代碼\文件處理\a.txt') as f:# 注意須要要用r防止轉義
一、文件路徑utf-8
二、指定處理模式資源
三、指定操做文本的字符編碼encoding=「 」rem
with open("a.txt", mode='rt',encoding='utf8') as f: print(f.writable()) print(f.readable()) print(f.read())
純淨模式字符串
一、r:(默認)只讀模式
一、默認mode = "rt"時要指定操做文本的字符編碼encoding=「 utf-8」
二、讀出二進制字節mode = "rb" ,不要指定encoding
三、讀取文件若是文件不存在,會報錯
r模式下的內置方法:
f .read() :所有一次性讀出來
f.readable():判斷是否可讀
f.readline() :執行一次讀一行
f.readlines() :所有讀出來,按照列表的形式把每一行做爲元素讀出來,而且把\n換行符也會一併讀出
with open(r"E:\Python\練習代碼\文件處理\as.txt", "r", encoding='utf-8') as f: print(f.read()) # print(f.readline())# 執行一次讀一行 # print(f.readline()) # print(f.readline()) # print(f.readline()) # print(f.readline()) print(f.readlines())# 所有讀出來,按照列表的形式把每一行做爲元素讀出來 with open("a.txt","rb") as f1: print(f1.read())
二、w:(慎用)只寫模式
一、若是文件不存在則創建一個新的文件,若是文件存在則清空文件內容從新寫入
二、只寫一個"w"默認是」wt",寫成二進制字節爲"wb"
f.write():只能寫一個字符串,而且會清空以前的文件內容
f.writable():判斷是否可寫
f.writelines():按照列表的形式,加數據到原文件中,也會清空原文件中數據 ,for + f.write()
with open("a.txt", "w", encoding='utf-8') as f: # f.write("你好,上海") f.writelines(["你好\n",'上海'])
三、a:只追加寫
一、若是文件存在則在數據後追加數據
二、若是文件不存在會新建一個文件寫入數據
with open("a.txt", "a", encoding='utf-8') as f: f.write("\n hello,上海")# \n是表示換行
+模式(瞭解)
都是可讀可寫的,而且保留自身原有的特性
一、r+:可讀可寫,可是寫時沒有文件不會建立新文件
二、w+:可讀可寫,無文件時會建立新的文件
三、a+:光標永遠在最後追加讀寫
必須結合r,w,a模式下使用
一、t:text文本模式
只能針對文本文件,讀寫文件只能以字符串爲單位,必定要指定encoding
二、b:bytes二進制模式
能夠讀寫任意文件,是以bytes二進制爲單位,不要指定encoding
with open(r"timg.jpg",mode="rb") as f1,open(r"小黃人.png",mode="wb") as f2: # xiao = f1.read() # f2.write(xiao) for xiao in f1: f2.write(xiao)
讀寫文本文件時,使用t模式自動幫咱們編碼和解碼了,可是其餘格式的文件,必需要用b模式,需手動解碼編碼
f.seek(光標移動的位數相對偏移度,指定光標從何開始)
f.seek(offset,whence) offset: 相對偏移度 (光標移動的位數)針對的是字節 whence:指定光標位置從何開始 0:從文件開頭(t模式下只能是0) 1:從當前位置 2:從文件末尾
t模式下只能指定0,若是指定一、2那光標移動位數只能是0,從文件頭開始,
b模式下能夠是0,1,2均可以使用
b模式下須要解碼才能正常讀出來
gbk中一箇中文字符是2個字節,一個英文字符半角是1個字節,全角是2個字節
utf-8中一箇中文字符是3個字節,一個英文字符是1個字節
with open(r'a.txt', mode="rb") as f: f.seek(6,0) print(f.read(3).decode("utf-8")) f.seek(6,1) print(f.read(6).decode("utf-8")) f.seek(-8,2) print(f.read(6).decode("utf-8")) with open(r'a.txt', mode="r",encoding="utf-8") as f: f.seek(6,0) print(f.read(1)) f.seek(0,1) print(f.read(1))
硬盤中的數據無法修改,更新都是新內容覆蓋舊內容,內存中的數據能夠修改
因此咱們修改數據都是將硬盤中的數據讀到內存中進行修改
具體的兩種方式:
一、將文件數據所有讀到內存而後修改
優勢:同一份數據只有一份進行修改
缺點:過多的佔用內存空間
with open(r"a.txt",mode="rt",encoding="utf-8") as f1: data = f1.read() with open(r"a.txt",mode="wt",encoding="utf-8") as f2: data2 = data.replace("上海","DSH") f2.write(data2)
二、以讀的模式打開,以臨時文件寫入,寫入後將原文件刪除,臨時文件重命名
需調用os模塊
優勢:不會佔用過多內存
缺點:文件修改中同一份數據存了兩份
import os with open(r"a.txt",mode="rt",encoding="utf-8") as f1,\ open(r"b.txt",mode="wt",encoding="utf-8") as f2: for i in f1: f2.write(i.replace("DSH","大上海")) os.remove("a.txt") os.rename("b.txt","a.txt")