1. 程式人生 > >Python學習:7.文件操作

Python學習:7.文件操作

TP 功能 str bytes python解釋器 odin 調用 示例 過程

文件操作

我們曾將聽過一個問題,將大象放入冰箱分為三步: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.文件操作