目錄
- 檔案操作
- 1.什麼是檔案?
- 2.代碼如何操作檔案
- 3. 檔案讀、寫、追加三模式
- 4. 檔案操作方法
- 1. 讀系列
- 2.寫系列
- 5. 檔案優化操作
- 6. 檔案操作模式
- 二進制模式讀寫操作
- 檔案内光标的移動(了解)
- 檔案的内容修改(了解)
檔案其實是作業系統暴露給使用者操作硬碟的快捷方式(接口)
關鍵字open()
三步走:
1.利用關鍵字open打開檔案
2.利用其它方法操作檔案
3.關閉檔案
檔案路徑
相對路徑與絕對路徑
路徑中出現了字母與斜杠的組合産生了特殊含義如何取消
在路徑字元串前面加一個r
eg:r'D:\py20\day08\a.txt'
格式:
open(檔案路徑,讀寫模式,字元編碼)
檔案路徑與讀寫模式是必須的
字元編碼是可選的(有些模式需要編碼)
res = open('a.txt', 'r', encoding='utf8')
print(res.read())
res.close() # 關閉檔案釋放資源
# with上下文管理(能夠自動幫你close())
with open(r'a.txt','r',encoding='utf8') as f1: # f1=open() f1.close()
print(f1.read())
"""以後代碼操作檔案 推薦使用with文法"""
r 隻讀模式(隻能看不能改)
# 路徑不存在:直接報錯
with open(r'b.txt', 'r', encoding='utf8') as f:
pass
# 路徑存在
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.read()) # 讀取檔案内所有的内容
f.write('123') # 寫檔案内容

w 隻寫模式(隻能寫不能看)
# 路徑不存在:路徑不存在自動建立
with open(r'b.txt', 'w', encoding='utf8') as f:
pass
# 路徑存在:1.會先清空檔案内容 2.再執行寫入操作
with open(r'a.txt', 'w', encoding='utf8') as f:
f.read()
f.write('hello world!\n')
f.write('hello world!\n')
f.write('hello world!\n')
a 隻追加模式(追加内容, 同樣不能讀)
# 路徑不存在, 建立一個新的檔案,可以寫入内容但不可以讀
with open(r'money.txt', 'a', encoding='utf8') as f1:
# f1.read() # 報錯
f1.write('insist study')
# 路徑存在, 在檔案内容的尾部追加新的寫入内容
with open(r'money.txt', 'a', encoding='utf8') as f2:
f2.write('graduation from Oldboy')
小總結:
我們所學習的r w a讀寫模式都隻能操作文本檔案
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.read()) # 一次性讀取檔案内所有的内容
print(f.readline()) # 每次隻讀檔案一行内容
print(f.readlines()) # 讀取檔案所有的内容 組織成清單 每個元素是檔案的每行内容
print(f.readable()) # 判斷目前檔案是否具備讀的能力
with open(r'a.txt','w',encoding='utf8') as f:
f.write('克服一切困難 奧利給!') # 往檔案内寫入文本内容
f.write(123) # 寫入的内容必須是字元串類型
f.writelines(['jason','kevin','tony']) # 可以将清單中多個字元串元素全部寫入
print(f.writable()) # True
print(f.readable()) # False
f.flush() # 直接将記憶體内檔案資料刷到硬碟 相當于ctrl+s
with open(r'a.txt', 'r', encoding='utf8') as f:
# print(f.read()) # 一次性讀取檔案内所有的内容
# print(f.read()) # 一次性讀取檔案内所有的内容
# print(f.read()) # 一次性讀取檔案内所有的内容
"""
1.一次性讀完之後 光标停留在了檔案末尾 無法再次讀取内容
2.該方法在讀取大檔案的時候 可能會造成記憶體溢出的情況
解決上述問題的政策就是逐行讀取檔案内容
"""
# for line in f: # 檔案變量名f支援for循環 相當于一行行讀取檔案内容
# line
'''以後涉及到多行檔案内容的情況一般都是采用for循環讀取'''
t 文本模式
1.預設的模式
r w a >>> rt wt at
2.該模式所有操作都是以字元串基本機關(文本)
3.該模式必須要指定encoding參數
4.該模式隻能操作文本檔案
b 二進制模式
1.該模式可以操作任意類型的檔案
2.該模式所有操作都是以bytes類型(二進制)基本機關
3.該模式不需要指定encoding參數
rb wb ab
with open(r'a.txt','rb') as f:
# print(f.read())
print(f.read(5).decode('utf8'))
with open(r'a.txt','r',encoding='utf8') as f:
print(f.read())
print(f.read(4))
"""
read() 括号内可以放數字
在t模式下表示字元個數
在b模式下表示位元組個數
英文字元統一使用一個bytes來表示
中文字元統一使用三個bytes來表示
"""
with open(r'b.txt', 'rb') as f:
print(f.read(4).decode('utf8'))
print(f.tell()) # 檢視光标移動了多少個位元組
f.seek(3, 1)
print(f.read().decode('utf8'))
"""
控制檔案内光标的移動 f.seek()
f.seek(offset,whence)
offset表示位移量
始終是以位元組為最小機關
正數從左往右移動
負數從右往左移動
whence表示模式
0:以檔案開頭為參考系(支援tb兩種模式)
1:隻支援b模式 以目前位置為參考系
2:隻支援b模式 以檔案末尾為參考系
"""
# 方式1 覆寫
with open(r'c.txt','r',encoding='utf8') as f:
data = f.read()
print(type(data))
with open(r'c.txt','w',encoding='utf8') as f1:
new_data = data.replace('tony','jason')
f1.write(new_data)
# 方式2 建立
import os
with open('c.txt', mode='rt', encoding='utf-8') as read_f, \
open('c.txt.swap', mode='wt', encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line.replace('SB', 'kevin'))
os.remove('c.txt') # 删除原檔案
os.rename('c.txt.swap', 'c.txt') # 重命名檔案
"""
方式1:優點 在檔案修改過程中同一份資料隻有一份 缺點 如果檔案過大記憶體會出現溢出進而崩潰
方式2: 優點 是記憶體不會出現溢出 缺點 在檔案修改過程中同一份資料存了兩份
"""