文件及文件的操作-讀、寫、追加的t和b模式


1.什么是文件?

文件是操作系統為用戶或應用程序提供的一個讀寫硬盤的虛擬單位。

文件的操作核心:讀和寫

對文件進行讀寫操作就是向操作系統發出指令,操作系統將用戶或者應用程序對文件的讀寫操作轉換為具體的硬盤指令。(比如控制盤片轉動,控制機械手臂移動來讀寫數據。)

2.為什么要有文件?

因為內存無法永久存儲文件,但凡想要永久保存數據,我們都要將數據保存到硬盤中。而操作文件就可以實現對硬件的操作。

 

3.如何用文件?

# 把硬盤中的數據都到內存中

#rawstring 原始字符串 縮寫為r,為了防止路徑轉義。

f = open(r"文件路徑",mode = "r")  # 向操作系統發起請求,要求操作系統打開文件,占用操作系統的資源。(准備階段)

date = f.read()  # 向操作系統發起讀的請求,操作系統轉換為具體的硬盤操作,將內容由硬盤都到內存。

f.close() # 謹記:用該方法對文件進行操作,操作完成后一定要及時關閉文件。(向操作系統發起請求,要求操作系統關閉資源,回收系統資源)

文件關閉后,操作系統已經關閉資源。不能再用f.read()讀取文件內容。print(f)依然有輸出,就是說還存在准備階段。

 

控制讀寫文件內容的結果有兩種:t模式(text)和b(bytes)模式。

注意:

1.t模式和b模式不能單獨使用,需要與r/w/a之一連用

2.默認的內容格式為t。

 

操作文件的基礎模式由三種。

1·r  默認的

2·w

3·a

 

1.r:read  只讀模式

只能讀,不能寫

在文件不存在時,會報錯  *****

在文件存在時,會將文件的指針移動到開頭

f=open(r'C:\Users\LENOVO\PycharmProjects\untitled2\db.txt',mode='rt',encoding='utf-8')
data1=f.read()
print('第一次:',data1) # 第一次打印結束已經把文件內容讀取完畢
print(type(data1))

data2=f.read()
print('第二次:',data2) # 第二次打印文件向后沒有內容,所以打印為空
f.close()

第一次: gddj
'shsk
sdjjsk
dhjd'
sjskks
<class 'str'>
第二次:

f=open(r'C:\Users\LENOVO\PycharmProjects\untitled2\db.txt',mode='rt',encoding='utf-8')
data2=f.read()
print('第二次:',data2) # 重新加載文件內容到內存,光標移動到頭部,可以讀取。
f.close()

f=open(r'C:\Users\LENOVO\PycharmProjects\untitled2\db.txt',mode='rt',encoding='utf-8')
print(f.readable())
print(f.readline(),end='')
print(f.readline(),end='')

lines=f.readlines()
print(lines)
f.close()



w:write只寫模式
1、只能寫,不能讀
2、在文件不存在時會創建空文件,在文件存在的時候會將文件內容清空(首次會清空,后續寫入不會清空前面寫入的) *****
f=open(r'C:\Users\LENOVO\PycharmProjects\untitled2\db.txt',mode='wt',encoding='utf-8') # 默認為wt模式(默認寫入字符串)
print(f.readable()) # 不可讀
f.read() # 報錯,不可讀
f.write('你好啊我的天\n你好啊我的地\n啊啊啊啊啊啊\n') # 文件里的內容被清空,后續寫入不會被清空。
f.write('4444\n')
f.write('5555')

lines=['1111\n','2222\n','33333\n']
for line in lines: # 和下面的writelines一樣效果
f.write(line)
f.writelines(lines)

f.close()


a:只追加寫模式
1、只能寫,不能讀 ***
2、在文件不存在時會創建空文件,在文件存在的時候會將指針移動到文件末尾 ****

f=open(r'C:\Users\LENOVO\PycharmProjects\untitled2\db.txt',mode='at',encoding='utf-8')
print(f.readable()) # 不可讀
f.read()

f.write('555555\n6666\n')
f.writelines(['77777\n','8888888\n','999999999\n'])

f.close()

b:二進制模式
注意:
1、一定不能指定字符編碼,只有t模式才與字符編碼有關 ***
2、b是二進制模式,是一種通用的文件讀取模式,因為所有的文件在硬盤中都是以二進制形式存放的 ***

f=open(r'C:\Users\LENOVO\PycharmProjects\untitled2\TIM圖片20180604145353.png','rb')
data=f.read()
print(data)
print(type(data))
f.close()
<class 'bytes'>

下面的操作就是打開一個視頻文件,視頻文件以只讀的二進制模式加載到內存,然后把視頻文件以只寫的二進制模式寫入到F盤
f=open('oldsiji.mp4','rb')
data=f.read()
f.close()
f=open(r'F:\oldsiji.mp4','wb')
f.write(data)
f.close()


循環讀
f=open(r'C:\Users\LENOVO\PycharmProjects\untitled2\db.txt','rt',encoding='utf-8')
for line in f:
print(line,end = "")
f.close()


f=open(r'C:\Users\LENOVO\PycharmProjects\untitled2\db.txt','rb')
for line in f:
print(line)
f.close()

f=open('oldsiji.mp4','rb')
for line in f:
print(line)
f.close()


f=open(r'C:\Users\LENOVO\PycharmProjects\untitled2\db.txt','wb')
f.write(b'eee')
f.write("你好啊".decode("utf-8")) # 'str' object has no attribute 'decode'
f.write("你好啊".encode("utf-8"))

f.close()


f=open(r'C:\Users\LENOVO\PycharmProjects\untitled2\db.txt','ab')
f.write('大家好,我是egon'.encode('utf-8'))
f.close()


# 上下文管理 *****
# 用with會自動幫你運行完關閉操作系統位置的文件,而且with后買你可以跟着多個讀寫操作 *****
with open(r'C:\Users\LENOVO\PycharmProjects\untitled2\db.txt','rb') as f,open(r'C:\Users\LENOVO\PycharmProjects\untitled2\prob','wt',encoding='utf-8') as f1:
# 文件的操作
src_data=f.read()
res=src_data.decode('utf-8')
print(res,type(res))
f1.write(res) # res必須是str,上面是wt格式。



with open('e.txt','rb') as f,\ # 這樣寫是因為\把\n的轉義消掉了。看起來更加美觀。
open('j.txt','wb') as f1:
#文件的操作
f1.write(f.read())








 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: