文件處理

文件處理

什麼是文件

操做系統給用戶提供的操做硬盤的簡單接口python

爲何要用文件

永久保存數據編碼

怎麼用文件

相對路徑:a.txt # 必須與當前py文件在同一級目錄操作系統

絕對路徑:E:\Python\練習代碼\文件處理\a.txtcode

操做文件流程

打開

一、open(須要結尾close關閉,不然佔用內存)

f = open('a.txt')
f = open(r"E:\Python\練習代碼\文件處理\a.txt")# 注意須要要用r防止轉義
f.close()# 回收操做系統的資源

f:文件句柄接口

二、with open (不須要用close結尾關閉文件)(上下文管理)

能夠同時打開多個文件,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")
相關文章
相關標籤/搜索