Python學習:7.文件操作
文件操作
我們曾將聽過一個問題,將大象放入冰箱分為三步: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+b wb或w+b xb或w+b ab或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,如果是自己在記事本寫的可能需要用gbk print(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‘> ale 3 13 <class ‘str‘> xsel 13
我們指針之前的字符進行讀取怎麽辦,我們可以使用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() 輸出結果: 7 alexsel
三、文件關閉
之前我們在文件操作中一直在使用,使用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.name print(ut) 輸出結果: name.txt
file.readable()
判斷打開文件是否可讀
f1 = open("asda.log","r+",encoding="utf-8") pd=f1.readable() print(pd) 輸出結果: True
file.readline()
僅讀取一行數據(自動把指針放在第一行末尾,再讀時,就是從第二行開始)
#問價內容:第一行是三顧茅廬,第二行是alexsel f1 = 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.文件操作