一、什麼是文件python
文件是操做系統提供給用戶或應用程序的一種虛擬單位,該虛擬單位直接映射的是硬盤空間。通俗點說,文件就是存放數據的地方ide
二、爲什麼要處理文件spa
用戶或應用程序直接操做文件(讀/寫)就被操做系統轉換成具體的硬盤操做,從而實現將內存中的數據永久保存到硬盤中操作系統
三、使用文件3d
一般,咱們使用電腦的時候,例如編寫了一段代碼,咱們要把這段代碼保存在硬盤上,方便下次使用。在Python中,要打開這個文件,須要三個步驟:指針
1)找出文件存放的路徑,打開文件日誌
2)對文件進行讀寫操做code
3)關閉文件blog
說到找出文件的存放路徑,就會引入相對路徑和絕對路徑的問題。在Windows中,相對路徑指的是相對於當前執行文件所在的文件夾開始查找所需的文件,絕對路徑是指從盤符開始直到這個文件的位置,寫一個完整的路徑。在Python中文件路徑有兩種表示方式,以我電腦上 python3.6.6 文件爲例:內存
Python絕對路徑寫法:用雙反斜線或者斜線區分層次
E:\\Python\\download\\python-3.6.6-amd64.exe
E:/Python/download/python-3.6.6-amd64.exe
Python相對路徑寫法:
若是我從download文件夾對這個文件操做,相對路徑寫爲:python-3.6.6-amd64.exe
四、文件的打開模式
f = open(r'a.txt', mode='r', encoding='utf-8') # 打開文件
data = f.read() # 對文件進行讀操做
f.close() # 關閉文件
r:只讀模式,打開文件默認是隻讀模式,文件不存在打開會報錯,若是文件存在文件指針跳到文件的開頭
w:只寫模式,文件不存在則建立,文件存在則覆蓋
a:追加模式,文件不存在則建立,文件存在則不會覆蓋,寫內容會以追加的方式寫(寫日誌文件的時候經常使用),追加模式是一種特殊的寫模式
t:文本模式,只能針對文本文件,讀寫文件都是以字符串爲單位的,必須指定 encoding 參數
b:二進制模式,文件以二進制的方式打開,讀寫文件都是以 bytes 爲單位的,必須與上面的三種模式在一塊兒使用,即rb,wb,ab,這種方式後面不用指定 encoding 參數
文件的打開還有一種方式,即上下文管理:
with open(r"a.txt", "rt", encoding = "utf-8") as f: data=f.read()
這種方式無需手動關閉文件
五、文件的讀寫操做
read():對文件進行讀操做,一次性讀取所有文件內容
readline():每次讀取一行
readlines():將每行內容做爲列表元素,返回的是一個列表
readable():判斷文件是否可讀
write():對文件進行寫操做
writelines():能夠寫一個序列,好比列表,會迭代寫入文件(後面會學到迭代)
writeable():判斷是否可寫
六、文件內指針移動
大前提:文件內指針的移動是以字節Bytes爲單位的,惟獨 t 模式下的 read 讀取內容是以字符爲單位
# a.txt文件裏存放內容: # 你好啊aaaa哈哈哈
with open("a.txt", "rt", encoding="utf-8") as f: data = f.read(3) print(data) # 輸出: # 你好啊
with open("a.txt", "rb") as f: data = f.read(3) print(data.decode("utf-8")) # 輸出: # 你
f.seek(指針移動的字節數, 模式控制): 控制文件指針的移動
模式控制:
0:默認的模式,該模式表明指針移動的字節數是以文件開頭做爲參照的
1:該模式表明指針移動的字節數是以當前所在的位置做爲參照的
2:該模式表明指針移動的字節數是以文件末尾的位置做爲參照的
強調:其中0模式能夠在 t 或者 b 模式使用,而1和2模式只能在 b 模式下用
f.tell():查看文件指針當前距離文件開頭的位置
0模式詳解:指針移動的字節數以文件開頭做爲參照,要注意若是文件中有中文字符,光標移動必定是3的倍數
# a.txt文件中存放: # 你好啊aaaa哈哈哈
with open("a.txt", "rt", encoding="utf-8") as f: f.seek(9, 0) print(f.tell()) print(f.read()) # 輸出: # 9 # aaaa哈哈哈
1模式詳解:指針移動的字節數以當前指針所在位置做爲參照
with open("a.txt", "rb") as f: f.seek(3, 1) print(f.tell()) f.seek(10, 1) print(f.tell()) print(f.read().decode("utf-8")) # 輸出: # 3 # 13 # 哈哈哈
2模式詳解:指針移動的字節數以文件的末尾位置做爲參照
with open("a.txt", "rb") as f: f.seek(-9, 2) data = f.read() print(data.decode("utf-8")) # 輸出: # 哈哈哈
小練習:向文件裏不斷地添加日誌信息,將日誌的最後一行打印輸出到屏幕上,每次都能打印最新添加的信息
# exercise.py
with open("access.log", "rb") as f: f.seek(0, 2) while True: line = f.readline() if len(line) == 0: continue
else: print(line.decode("utf-8"), end="") # run.py
import time with open("access.log", "a+", encoding="utf-8") as f: f.write("%s 下雨了\n" %time.strftime("%Y-%m-%d %X")) # 每運行一次 run.py,都會打印獲取系統當前時間 # 運行: # 2018-09-21 18:06:11 下雨了 # 2018-09-21 18:06:12 下雨了 # 2018-09-21 18:06:13 下雨了
七、文件修改
1)硬盤空間沒法修改,硬盤中的數據更新都是用新的內容覆蓋舊的內容,內存控制能夠修改
2)文件對應的是硬盤空間,硬盤不能修改,即文件本質也是不能修改的,可是咱們看到的文件內容能夠修改,這是把硬盤中的文件內容讀入內存,而後在內存中修改完畢後再覆蓋回硬盤
有兩種實現方式:
1)將文件內容一次性所有讀入內存,而後在內存中修改完畢後再覆蓋寫回原文件
優勢:在文件修改過程當中同一份數據只有一份,不會過多的佔用硬盤空間
缺點:會過多地佔用內存
# a.txt中存放的內容是: # 你好啊aaaa哈哈哈
# 如今將aaaa改成bbbb
with open("a.txt", "r", encoding="utf-8") as f: data = f.read() with open("a.txt", "w", encoding="utf-8") as f: f.write(data.replace("aaaa", "bbbb")) # 運行: # 你好啊bbbb哈哈哈
2)以讀的方式打開原文件,以寫的方式打開一個臨時文件,將原文件一行一行讀入內存,修改完後寫入臨時文件,而後再刪除原文件,將臨時文件重命名爲原文件名
優勢:不會佔用過多的內存
缺點:在文件修改過程當中同一份數據存了兩份,硬盤空間不足將沒法完成修改
# 如今a.txt裏存放了內容是: # 你好啊bbbb哈哈哈
# 將bbbb改成aaaa
import os with open("a.txt", "r", encoding="utf-8") as f1, \ open("a_temp.txt", "w", encoding="utf-8") as f2: for line in f1: f2.write(line.replace("bbbb", "aaaa")) os.remove("a.txt") os.rename("a_temp.txt", "a.txt") # 運行: # 你好啊aaaa哈哈哈