硬盤纔是我們能永久存放數據的地方,內存只能暫時存放,斷電就會丟失數據.所以我們需要對硬盤進行操作.而操作系統給我們提供了一種對硬盤進行操作的模式: 文件
什麼是文件:
文件是操作系統爲用戶或應用程序提供的一個讀寫硬盤的虛擬單位
文件的操作核心就:讀、寫
即我們只需要對於進行讀寫操作,就是對操作系統發起請求,然後由操作系統將用戶或者應用程序
對文件的讀寫操作轉換成具體的硬盤指令(比如控制盤片轉動,控制機械手臂移動來讀寫數據)
f=open(r'E:\SH_fullstack_s2\day08\a.txt',mode='r') # 向操作系統發起請求,要求操作系統打開文件,佔用操作系統的資源
data=f.read() # 向操作系統打開發起讀請求,會被操作系統轉成具體的硬盤操作,將內容由硬盤讀入內存
f.close() #向操作系統發起請求,要求操作系統關閉文件,回收系統資源
文件的操作有3種:
- r:read,只讀模式
1、只能讀,不能寫
2、在文件不存在時,會報錯,在文件存在的時候會將文件指針移動到開頭
f=open(r'b.txt',mode='rt',encoding='utf-8')
data1=f.read() - w:只寫模式
1、只能寫,不能讀
2、在文件不存在時會創建空文件,在文件存在的時候會將文件內容清空
f=open(r'c.txt',mode='wt',encoding='utf-8')
f.write('你好啊我的天\n你好啊我的地\n啊啊啊啊啊啊\n') - a:只追加寫模式
1、只能寫,不能讀
2、在文件不存在時會創建空文件,在文件存在的時候會將指針移動到文件末尾
f=open('d.txt',mode='at',encoding='utf-8')
f.write('555555\n6666\n')
f.close() -
b:二進制模式
1、一定不能指定字符編碼,只有t模式才與字符編碼有關
2、b是二進制模式,是一種通用的文件讀取模式,因爲所有的文件在硬盤中都是以二進制形式存放的
讀:f=open('d.txt','rb')
f.close()寫:f=open('e.txt','wb') f.write('你好啊'.encode('utf-8')) f.close() 追加寫,不存在文件則創建:f=open('e.txt','ab') f.write('大家好'.encode('utf-8')) f.close()
控制指針移動的三種方式
f.seek(offset,whence)
offset代表文件的指針的偏移量,單位是字節bytes
whence代表參考物,有三個取值
0:參照文件的開始
1:參照當前文件指針所在位置
2: 參照文件末尾
ps:快速移動到文件末尾f.seek(0,2)
強調:其中whence=1和whence=2只能在b模式下使用 - 0 參照文件的開始
f = open('c.txt', mode='rt', encoding='utf-8')
f.seek(9, 0) # 從文件的開始往後讀9個字節
print(f.tell()) # 每次統計都是從文件開頭到當前指針所在位置
print(f.readline()) # 從第9個字節開始往後讀
f.close() # 關閉系統資源 - 1 參照當前文件指針所在位置
f = open('c.txt', mode='rb')
f.readline() # 讀一行
f.seek(6, 1) # 從當前指針所在位置往後讀6個字節
print(f.readline().decode('utf-8')) # 從這一行的第6個字節開始讀一行,用utf-8模式打開
print(f.tell()) # 每次統計都是從文件開頭到當前指針所在位置
f.close() # 關閉系統資源 - 2 參照文件末尾
f=open('c.txt',mode='rb')
f.seek(-9,2) # 從文件末尾開始讀,讀9個字節
print(f.readline().decode('utf-8')) # 從文件末尾的倒數第9個字節開始讀,讀一行
print(f.tell()) # 每次統計都是從文件開頭到當前指針所在位置
f.close()
只有在t模式下的read(n),n代表的是字符個數,除此之外其他但凡涉及文件指針的移動都是以字節爲單位的
f=open('c.txt',mode='rt',encoding='utf-8')
print(f.read(3)) # 讀了三個字符,而不是三個字節
f.close()
-
1
f = open('b.txt', mode='at', ) f.truncate(9) # 參照物永遠是文件開頭 f.close()
修改文件的方式有兩種
*1 思路:先將原文件內容一次性全部讀入內存,然後在內存修改完畢後,再
覆蓋寫回原文件
優點:在修改期間,文件內容只有一份
缺點:當文件過大的情況下或佔用過多的內存空間
with open('d.txt','rt',encoding='utf-8') as read_f:
msg=read_f.read()
msg=msg.replace('alex','xiang')
#print(msg)with open('d.txt','wt',encoding='utf-8') as write_f:
write_f.write(msg) -
2 思路:
1、以讀的方式打開原文件,以寫的方式打開一個新文件
2、從原文件中循環讀取每一行內容修改後寫入新文件
3、刪除原文件,將新文件重命名爲原文件的名字優點:同一時刻只有一行內容存在於內存中
缺點:在修改期間,文件內容始終存在兩份,但修改完畢後會只留一份
import os
with open('d.txt', 'rt', encoding='utf-8') as read_f, \
open('d.txt.swap', 'wt', encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line.replace('xiang', 'ALEXSB'))os.remove('d.txt') # 刪除老文件 os.rename('d.txt.swap', 'd.txt')