標籤:AC 添加 技術分享 代碼塊 讀寫 write encode 通過 行資料
檔案操作
我們曾將聽過一個問題,將大象放入冰箱分為三步:1、開啟冰箱門,2、將大象放進去,3、關上冰箱門。今天我們要講的Python檔案操作的步驟就像將大象放入冰箱的步驟一樣。
使用Python操作檔案的基本步驟:
- 開啟檔案
- 對檔案內容進行操作(讀取檔案資訊,向檔案中寫入資訊等)
- 關閉檔案
一、開啟檔案
在上一篇的內建函數介紹中,我們提到了open這個函數,這個函數的作用就是開啟一個檔案。
格式一
檔案控制代碼 = open(檔案路徑,開啟格式,編碼)
開啟檔案時,需要指定檔案路徑和以何種方式開啟檔案,開啟後,即可擷取該檔案控制代碼,如後通過此檔案控制代碼對該檔案操作。
f = open("c:/asd.txt","r",encode=‘utf-8‘) #開啟c盤下的asd.txt檔案date = f.read() #讀取檔案內容f.close() #關閉檔案print(date) #輸出檔案內容
格式二
with open(檔案路徑,開啟格式,編碼),使用這個開啟檔案不用再最後使用close()關閉檔案,因為使用這個with自動進行檔案關閉,但是這個需要你檔案的操作都在代碼塊中,注意縮排。
with open("c:/asd.txt",encoding=‘utf-8‘) as f: data = f.read()print(data)
代開檔案的各種格式
開啟檔案時,需要指定檔案路徑和以何種方式開啟檔案,開啟後,即可擷取該檔案
控制代碼,如後通過此檔案控制代碼對該檔案操作。
開啟的模式有:
r,唯讀檔案,【預設】w,唯寫檔案,【不可讀,不存在建立;存在則清空內容】x,唯寫檔案,【不可讀,不存在建立,存在則報錯】a,追加模式,【不可讀,不存在建立,存在則只追加內容】
"+"表示可以同時讀寫某個檔案
r+,讀寫【可讀,可寫】w+,寫讀【可讀,可寫】x+,寫讀【可讀,可寫】a+,寫讀【可讀,可寫】
"b"表示以位元組的方式操作
rb或r+bwb或w+bxb或w+bab或a+b
以b方式開啟時,讀取到的內容是位元組類型,寫入時也需要寫入的是位元組類型。
二、對檔案內容進行操作
使用一般格式開啟檔案
1、使用唯讀格式開啟檔案的時候,進行檔案寫入就會報錯。
2、使用寫入格式代開檔案的時候,會清除原有內容,然後重新寫入內容。
f = open("asd","w")#清空原有檔案內容f.write("asd")#重新寫入f.close()
3、使用唯寫模式開啟檔案,沒有檔案就建立,有檔案的時候就報錯。
然後我們再次使用上一條命令,就會發生報錯,因為檔案存在了。
4、追加模式開啟檔案,當檔案不存在的時候建立檔案,當檔案存在的時候在檔案結尾追加內容。
f = open("asd","a")#不存在建立,存在追加f.write("asd")f.close()
使用位元組格式開啟檔案
1、唯讀格式
f = open("asd","rb")#在這裡開啟時是以位元組方式讀,所以不需要加encoding="utf-8"data = f.read() f.close()print(type(data))輸出結果:<class ‘bytes‘>
2、唯寫格式
f = open("asd","wb")data = f.write(bytes("中國",encoding = "utf-8"))f.close() #用位元組方式寫入時,需要把字串轉換為位元組
兩種開啟檔案的內部編碼機制
普通格式
python內部將010101自動轉換為字串(因為在本質上在在硬碟裡存的就是0101,所以在讀取資料時也是0101,而普通開啟時,會自動將位元組轉換為字串預設使用utf-8編而在轉字串是我們可以指定什麼編碼格式轉成字串)。
010101======>python解譯器(轉換為字串)=====>程式員看到
位元組格式
用位元組方式開啟時位元組直接給到程式員,沒有編譯過程,所以不能添加encoding =""在你寫入是,如果你寫入的是字串,你需要吧字串轉換為010101,不然會報錯因為位元組方式開啟沒有編譯過程,儲存時也不會自動編譯成0101所以需要自己吧字串轉換為位元組f.write(bytes("中國",encoding = "utf-8")),才能儲存。
010101======>程式員看到
樣本
使用位元組格式讀取檔案,檔案裡原來儲存的是"中國"。
f = open("asd","rb")data = f.read()f.close()print(data)data1 = str(data,encoding = "utf-8")#如果是用python儲存的就是utf-8,如果是自己在記事本寫的可能需要用gbkprint(data1)輸出結果:b‘\xe4\xb8\xad\xe5\x9b\xbd‘中國
使用位元組格式寫入檔案,檔案中儲存的還是"中國"。
f = open("asd","wb")str_a = "中國"bytes_a = bytes(str_a,encoding="utf-8")f.write(bytes_a)print(bytes_a)f.close()輸出結果:b‘\xe4\xb8\xad\xe5\x9b\xbd‘
使用一般格式輸入輸出的都是字串,使用位元組格式輸入輸出的都是位元組,在我們使用的時候一般不使用位元組格式進行檔案讀寫。
有關讀寫檔案內部指標問題
f = open("world.txt", "r+",encoding=‘utf-8‘)data = f.read()print(type(data), data)f.write("地球村")a = f.read()print(type(a), a)# 在這裡輸出的是空的,在讀寫時有一個指標,你讀一個,指標就向後移一個,追加一個字元就再向後移一個,等你再次輸出是,指標就指向空的地方,所以輸出是空的print(f.tell())#輸出指標位置,位元組,一個漢字三個位元組f.close()輸出結果:<class ‘str‘> 地球<class ‘str‘> 9
相關樣本:
檔案原內容:alexsel
f = open("name.txt", "r+")data = f.read(3)print(type(data), data)print(f.tell()) #輸出當前指標位置f.write("地球村")print(f.tell())a = f.read() print(type(a), a)print(f.tell())f.close()輸出結果:<class ‘str‘> ale313<class ‘str‘> xsel13
我們指標之前的字元進行讀取怎麼辦,我們可以使用seek()調整指標位置。
f = open("name.txt","w+",encoding="utf-8")f.write("三顧茅廬")f.seek(0) #這個可以將指標移動到最開始(0),不移動,在輸出是就的是空的data = f.read()f.close()print(data)輸出結果:三顧茅廬
使用追加模式開啟檔案的時候,檔案指標直接在最後。
f = open("asda.log","a+",encoding="utf-8")print(f.tell()) #使用追加的時候,開啟檔案的時候,指標直接在最後data = f.read() print(data) #指標直接在最後,所以這裡輸出為空白f.seek(0)data = f.read()print(data)f.close()輸出結果:7alexsel
三、檔案關閉
之前我們在檔案操作中一直在使用,使用close()進行檔案關閉,不對檔案檔案關閉會導致出錯。
檔案操作中使用到的方法
file為檔案控制代碼
file.close()
方法重新整理緩衝區裡任何還沒寫入的資訊,並關閉該檔案,這之後便不能再進行寫入。
file.write()
向檔案中寫入資料
file.fulsh()
重新整理檔案內部緩衝區
f1 = open("asda.log","r+",encoding="utf-8")f1.write("啊啊啊啊啊")f1.flush()f1.seek(0)print(f1.read())輸出結果:
啊啊啊啊啊
當檔案還沒有關閉時,這些東西就還沒有存到硬碟裡,只是在記憶體裡就像你在記事本輸入了一串字元但是沒有儲存一樣,只是在記憶體裡,flush()功能就是把寫入的字元進行儲存,就像記事本裡的儲存一樣,把記憶體的內容重新整理到硬碟裡。
file.name
擷取操作檔案的檔案名稱
f = open("name.txt","r+",encoding="utf-8")ut = f.nameprint(ut)輸出結果:name.txt
file.readable()
判斷開啟檔案是否可讀
f1 = open("asda.log","r+",encoding="utf-8")pd=f1.readable()print(pd)輸出結果:True
file.readline()
僅讀取一行資料(自動把指標放在第一行末尾,再讀時,就是從第二行開始)
#問價內容:第一行是三顧茅廬,第二行是alexself1 = open("name.txt","r+",encoding="utf-8")data = f1.readline()print(data)data1 = f1.readline()print(data1)f1.close()輸出結果:三顧茅廬alexsel
file.seekable()
指標是否可操作
f1 = open("name.txt","r+",encoding="utf-8")ut = f1.seekable()print(ut)f1.close()輸出結果:True
總結:
- 不管是讀檔案還是寫檔案,操作完成後都要調用close()來關閉檔案
- 但是調用with… as就可以省去close()了
- 可以指定讀取和寫入檔案編碼方式,就是在對用函數中加入encoding=’xxx’
- 我們可以使用各種方法方便我們對檔案的操作
- 讀寫檔案是我們需要注意一下指標的位置
今天的Python的檔案操作就到這裡,這裡僅僅是簡單的學習,以後我們做簡單的項目的時候會加深練習。
Python學習:7.檔案操作