20181126(檔案相關)
一、檔案的基本操作
bytes就當成二進位制看。
1.什麼是檔案:
檔案是作業系統為應用程式或者使用者提供的一種操作硬碟的虛擬單位
強調:
檔案是作業系統提供的虛擬單位
應用程式或者使用者對檔案的讀寫操作其實都是向作業系統傳送指令
2.為什麼用檔案:
檔案對應的硬碟空間,如果需要考慮永久儲存資料就必須使用檔案
3.如何用檔案:
路徑問題
絕對路徑:總是從根檔案中開始
win C:\a\b\c\d.txt
linux /a/b/c/d.txt
相對路徑:相對於當前執行檔案所在的資料夾
/a/b/c.txt
二、檔案操作的方法:讀寫相關的方法
Ⅰ.開啟檔案
f=open(r'D:\脫產\day09\a.txt,mode='r',encoding='utf-8') # 路徑前面加r是因為反斜槓會有特殊含義,路徑前面加r,後面的路徑就為純文字模式了。
print(f)
Ⅱ.讀/寫檔案
data=f.read()
print(data)
f.write()
Ⅲ.關閉檔案
f.close() #向作業系統傳送指令,令作業系統關閉開啟的檔案,回收作業系統資源。讀寫內容應該在檔案關閉之前進行操作
print(f)
上下文管理的方法:
with open('a.txt',mode='rt',encoding='utf-8') as f:
data=f.read()
print(data)
三、檔案的開啟模式:rwa、bt #尤其重要!
1.基本介紹
控制檔案讀寫操作的模式
r (預設)
w
a
控制檔案讀寫內容的模式(不能單獨使用,必須與r,w,a連用)
t(預設)
b
2.詳細介紹
控制檔案讀寫操作的模式
r (預設):只讀模式,以該模式開啟檔案,當檔案不存在時,會報錯;當檔案存在時檔案指標在檔案開頭
with open('a.txt',mode='rt',encoding='utf-8') as f:
w:只寫模式,以該模式開啟檔案,當檔案不存在時,建立一個空文件;當檔案存在時,清空檔案。檔案指標在檔案開頭。(建立空文件,(如果有)舊文件就會覆蓋)
with open('b.txt',mode='wt',encoding='utf-8') as f:
print(f.readable())
print(f.writable())
# 在開啟檔案不關閉的情況下,連續的寫入,新寫的內容總是在老內容之後;關閉後在開啟就會覆蓋上次。
f.write('你瞅啥\n')
f.write('瞅你咋地\n')
f.write('吧啦啦啦...\n')
a:只追加寫模式,以該模式開啟檔案,當檔案不存在時,建立一個空文件;當檔案存在時,不清空檔案。檔案指標跳到檔案末尾。
with open('c.txt',mode='at',encoding='utf-8') as f:
f.write('hello\n')
f.write('good boy\n')
f.writelines(['a','1'])
控制檔案讀寫內容的模式(不能單獨使用,必須與r,w,a連用)
t(預設):無論讀寫都是以字元為單位的,只能操作文字檔案,必須指定encoding引數。
b:無論讀寫都是以bytes為單位的,可以操作所有檔案,一定不能指定encoding引數。
with open('a.txt',mode='rb') as f:
data=f.read()
print(data,type(data))
print(data.decode('utf-8'))
with open('01.mp4',mode='rb') as f:
data=f.read()
print(data,type(data))
表格:檔案模式
模式 | 描述 |
---|---|
r | 以只讀方式開啟檔案。檔案的指標放在檔案的開頭,這是預設模式 |
rb | 以二進位制格式開啟一個檔案用於只讀。檔案的指標放在檔案的開頭,這是預設模式 |
r+ | 開啟一個檔案用於讀寫。檔案的指標放在檔案的開頭 |
rb+ | 以二進位制格式開啟一個檔案用於讀寫。檔案的指標放在檔案的開頭 |
w | 開啟一個檔案只用於寫入。檔案已存在則覆蓋,不存在則建立新檔案 |
wb | 以二進位制格式開啟一個檔案只用於寫入。檔案已存在則覆蓋,不存在則建立新檔案 |
w+ | 開啟一個檔案用於讀寫。檔案已存在則覆蓋,不存在則建立新檔案 |
wb+ | 以二進位制格式開啟一個檔案用於讀寫。檔案已存在則覆蓋,不存在則建立新檔案 |
a | 開啟一個檔案用於追加。檔案已存在,檔案指標就會放在檔案的末尾,不存在則建立新檔案 |
ab | 以二進位制格式開啟一個檔案用於追加。檔案已存在,檔案指標就會放在檔案的末尾,不存在則建立新檔案 |
a+ | 開啟一個檔案用於讀寫。檔案已存在,檔案指標就會放在檔案的末尾,不存在則建立新檔案 |
ab+ | 以二進位制格式開啟一個檔案用於追加。檔案已存在,檔案指標就會放在檔案的末尾,不存在則建立新檔案 |
print(f.readable())
print(f.writable())
print(f.readline())
print(f.readline(),end=' ')
for line in f:
print(line)
print(f.readlines()) #存成列表,此處可以測試一下
拷貝檔案小程式
with open('01.mp4',mode='rb',) as read_f,\
open(r'D:\1111.mp4',mode='wb') as write_f:
data=read_f.read()
write_f.write(data)
瞭解
+:不能單獨使用,必須與raw連用,r+,w+,a+
with open('c.txt',mode='at',encoding='utf-8') as f:
print(f.readable())
print(f.writable())
import os # 匯入os模組
os.remove(file_name) # file_name為需要刪除的檔名,如檔案不在當前目錄下,則檔名需要使用絕對路徑
4、檔案修改的兩種方式 #尤其重要!
方式一:
1.以讀的方式開啟原始檔
2.將檔案內容一次性全讀入記憶體,在記憶體中完成修改
3.以寫的方式開啟原始檔,然後將修改後的檔案一次性寫入原始檔。
總結:
優點:在檔案修改過程中只存在一份資料
缺點:浪費記憶體
with open('b.txt',mode='rt',encoding='utf-8') as f1:
msg=f1.read()
new_msg=msg.replace('alex','kevin')
with open('b.txt',mode='wt',encoding='utf-8') as f2:
f2.write(new_msg)
方式二:
1.以讀的方式開啟原始檔,以寫的方式開啟一個臨時檔案
2.讀取原始檔的一行內容到記憶體中,將修改的結果寫入臨時檔案,迴圈往復直到改
3.刪除原始檔,將臨時檔案重新命名為原始檔名。
優點:同一時間在記憶體中只有檔案的一行內容,更節省記憶體
缺點:在檔案修改過程中硬碟存在兩份資料
import os
with open('b.txt',mode='rt',encoding='utf-8') as read_f,\
open('.b.txt.swap',mode='wt',encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line.replace('kevin','alex'))
os.remove('b.txt')
os.rename('.b.txt.swap','b.txt')