文章目錄
- 前言
- 12. Python檔案操作
- 12.1 檔案的打開、寫入、關閉
- 12.2 主訪問模式的特點(r、w、a)
- 12.3 讀取函式(read、readlines、readline)
- 12.4 訪問模式的特點(r+、w+、a+)
- 12.5 檔案的定位讀寫(tell函式、seek函式)
- 12.6 檔案備份
- 12.7 檔案和檔案夾的操作
- 12.8 批量重命名
- 12.9 小總結
前言
準備在這篇中將Python基礎部分完結,敬請期待,未完待續…
12. Python檔案操作
檔案模式
| 模式 | 描述 |
|---|---|
| r | 以只讀方式打開檔案,檔案的指標將會放在檔案的開頭,這時默認模式 |
| rb | 以二進制格式打開一個檔案用于只讀,檔案指標將會放在檔案的開頭,這時默認格式 |
| r+ | 打開一個檔案用于讀寫,檔案指標將會放在檔案的開頭, |
| rb+ | 以二進制格式打開一個檔案用于讀寫,檔案指標將會放在檔案的開頭, |
| w | 打開一個檔案用于寫入,如果該檔案已存在則打開檔案,并從開頭開始編輯,即原有內容會被洗掉,如果該檔案不存在,創建新檔案 |
| wb | 以二進制格式打開一個檔案只用于寫入,如果該檔案已存在則打開檔案,并從開頭開始編輯,即原有內容會被洗掉,如果該檔案不存在,創建新檔案, |
| w+ | 打開一個檔案用于讀寫,如果該檔案已存在則打開檔案,并從頭開始編輯,即原有內容會被洗掉,如果該檔案不存在,創建新檔案 |
| wb+ | 以二進制格式打開一個檔案用于讀寫,如果該檔案已存在則打開檔案,并從開頭開始編輯,即原有內容會被洗掉,如果該檔案不存在,創建新檔案, |
| a | 打開一個檔案用于追加,如果該檔案已存在,檔案指標會放在檔案的結尾,也就是說,新的內容將會被寫入到已有內容之后,如果該檔案不存在,創建新檔案進行寫入 |
| ab | 以二進制格式打開一個檔案用于追加,如果該檔案已存在,檔案指標將會放在檔案的結尾,也就是說,新的內容將會被寫入到已有的內容之后,如果該檔案不存在,創建新檔案進行寫入, |
| a+ | 打開一個檔案用于讀寫,如果該檔案已存在,檔案指標將會放在檔案的結尾,檔案打開時會是追加模式,如果該檔案不存在,創建新檔案用于讀寫 |
| ab+ | 以二進制格式打開一個檔案用于追加,如果該檔案已存在,檔案指標將會放在檔案的結尾,如果該檔案不存在,創建新檔案用于讀寫, |
巧記檔案模式
'''
1. 如果是帶b的,不管是r和b配合,還是w、a和b配合,但凡是帶b的,都是以二進制格式操作檔案
2. 但凡是帶+號的,都是可讀可寫模式,
3. r+ 、rb+、w+都是可讀可寫有什么區別嗎??? 所有的訪問模式,它的基礎特點都要遵循與主訪問模式(r、w、a),比如:rb、r+、rb+都是基于r訪問模式拓展開來,
舉個栗子:
比如說r,只讀方式打開,如果檔案不存在,會報錯,如果rb、r+、rb+去打開一個檔案,不論是讀寫還是二進制讀寫,只要檔案不存在,但凡帶r的都報錯,
比如說w訪問模式的,不管是wb、w+、wb+,如果打開一個檔案,檔案不存在,則新建檔案,這就可以說明w+和r+的區別了,
注意:
1. 檔案指標:相當于游標的位置,游標后的內容可以讀取出來,游標前的內容讀取不出來,檔案指標關系著檔案寫入和讀取資料的內容,
2. a訪問模式,以a為基準的訪問模式,檔案指標都是在結尾,因為在后面才開始追加,
3. 檔案操作不僅有三種主訪問模式(r、w、a),依賴這三種主訪問模式,還可以拓展好幾種訪問模式,
'''
12.1 檔案的打開、寫入、關閉
上栗子,一看就懂:
'''
在python,使用open函式,可以打開已經存在的檔案,或者創建一個新檔案,
語法:open(name, mode)
name:是要打開的目標檔案名的字串(可以包含檔案所在的具體路徑)
mode: 設定打開檔案的模式(訪問模式):只讀、寫入、追加等,
'''
# 1. 打開open()
f = open('test.txt','w') # 如果這個檔案不存在,則新建此檔案
# 2. 讀寫操作 write() read()
f.write('aaa')
# 3. 關閉 close()
f.close()
'''
總結:
1.檔案操作的作用是把一些內容(資料)存盤起來,可以讓程式下一次執行的時候直接使用,而不必重新制作一份,省事省力.
2.這里的關閉相當于就是保存了,如果檔案不關閉,這個檔案將一直占用計算機記憶體,記憶體消耗比較大的,對于計算機來說,記憶體消耗大,記憶體占用量大,風險比較高了.
3. 注意:可以只打開和關閉檔案,不進行任何讀寫操作
'''
12.2 主訪問模式的特點(r、w、a)
主訪問模式(r、w、a)
# 主訪問模式的特點,基礎訪問模式的特點(r、w、a)
'''
實驗目標:
1. 訪問模式對檔案的影響
2. 訪問模式對wirte()的影響
3. 訪問模式是否可以省略
'''
=========================================================================
r: 如果檔案不存在,報錯:不支持寫入操作,表示只讀
f = open('test.txt1', 'r') # 因為是讀操作,沒有這個檔案,所以報錯
f.write('aa') # 報錯,因為是只讀模式,不能寫入
# 下面的才能正常執行
f = open('test.txt','r')
f.close()
==========================================================================
# w:只寫,如果檔案不存在,新建檔案,執行寫入,如果不存在則會會覆寫原有內容
f = open('1.txt', 'w') # 如果沒有1.txt這個檔案,則會新建這個檔案
f.write('bbb') # 1.txt檔案中的內容是aaa,現在變成了bbb
f.close()
==========================================================================
# a:追加,如果檔案不存在,新建檔案,在寫入內容,如果檔案存在,在原有內容基礎上,追加新內容
f = open('1.txt','a')
# f = open('2.txt','a') # 如果檔案不存在,則新建檔案
f.write('helloworld')
f.close()
=========================================================================
# 訪問模式引數是否可以省略,如果省略表示訪問模式為r
# f = open('100.txt') # 找不到檔案,報錯
f = open('1.txt') # 這個時候不報錯了
f.close()
12.3 讀取函式(read、readlines、readline)
read()
'''
read()
檔案物件.read(num)
num表示要從檔案中讀取的資料的長度(單位是位元組),如果不寫引數,則讀取所有內容
'''
f = open('test.txt','r')
# 文章內容如果換行,底層有\n,會有位元組占位,導致read書寫引數讀取出來的眼睛看到的個數和引數不匹配
# read不寫引數表示讀取所有:
# print(f.read()) # read不寫引數,表示讀取所有
print(f.read(10))
readlines()
'''
readlines()可以按照行的方式把整個檔案中的內容進行一次性讀取,并且回傳的是一個串列,其中每一行的資料為一個元素
'''
f = open('test.txt','r')
con = f.readlines()
print(con) # 輸出['aaaaa\n', 'bbbbb\n', 'ccccc\n', 'ddddd'] \n是換行符的意思
f.close()
readline()
'''
readline()一次讀取一行內容
'''
f = open('test.txt','r')
con = f.readline()
print(con) # aaaaa 這是test.txt檔案內容的第一行
con = f.readline()
print(con) # bbbbb 這時test.txt檔案內容的第二行
f.close()
12.4 訪問模式的特點(r+、w+、a+)
除了主訪問模式外(r、w、a),說一下其他的訪問模式(r+、w+、a+)
"""
帶加號的訪問模式對檔案的影響,以及檔案指標對資料讀取的影響
測驗目標:
1.r+ 和 w+ a+的區別
2.檔案指標對資料讀取的影響
"""
# r+:r沒有該檔案則報錯;檔案指標在開頭,所以能讀取出來資料
f = open('test.txt','r+')
print(f.read()) #
f.close()
# w+: 沒有該檔案會新建檔案:w特點:檔案指標在開頭,用新內容覆寫原內容
# f = open('test1.txt','w+') # 如果沒有該檔案則新建檔案
# 用新內容把原內容覆寫掉,這里只進行了讀取,沒有呼叫write寫入,那就代表寫入的是空的,空的內容把有資料的內容給覆寫掉了
f = open('test.txt','w+') # 此時test檔案里的內容被清空,因為被覆寫了
con = f.read()
print(con)
f.close()
# a+:沒有該檔案會新建檔案:檔案指標在結尾,無法讀取資料(檔案指標后面沒有資料)
f = open('test100.txt','a+') # 沒有test100.txt這個檔案
f = open('test.txt','a+')
con = f.read() # 檔案指標在結尾,無法讀取資料(檔案指標后面沒有資料)
print(con)
f.close()
12.5 檔案的定位讀寫(tell函式、seek函式)
telll():回傳檔案指標的當前位置
直接上栗子,一看就懂:
# dong.txt檔案中的內容是:hello,world
file = open("dong.txt", "r")
words = file.read(4)
print(f'讀取的資料是:{words}') # hell
# 查找當前位置
position = file.tell()
print(f'當前位置是:{position}') # 4
words = file.read(5)
print(f'讀取的資料是:{words}') # o,wor
position = file.tell()
print(f'當前位置是:{position}') # 9
seek():從指定位置開始讀取或者寫入檔案的資料
'''
語法:檔案物件.seek(偏移量,起始位置)
起始位置:0 檔案開頭 1 當前位置 2 檔案結尾
作用:用來移動檔案指標
目標:
1. r模式 :改變檔案指標位置,改變讀取資料開始位置或把檔案指標放結尾(無法讀取資料)
2. o模式 : 改變檔案指標位置,做到可以讀取出來資料
'''
# test.txt檔案的內容是:aaaaa
f = open('test.txt', 'r+')
# 1. 改變讀取資料開始位置
# f.seek(2,0) # 從第三個a開始讀取
f.seek(0,2) # 指標到了檔案結尾,讀取不出來資料
con = f.read()
print(con)
# 把檔案指標放結尾(無法讀取資料)
# f.seek(0, 2)
# 2. a 改變檔案指標位置,做到可以讀取出來資料
f.seek(0,0) # 這時指標跑到了開頭,這時可以讀出資料
# f.seek(0) # 如果是兩個0,可以省略寫一個0
con = f.read()
print(con)
f.close()
12.6 檔案備份
根據前面的知識,來進行檔案備份,中間有一步進行了優化:
# 1. 用戶輸入目標檔案
old_name = input('請輸入您要備份的檔案名:')
print(old_name)
# 2. 規劃備份檔案的名字
# 2.1 提取后綴 -- 找到名字中的點 -- 名字和后綴分離 -- 最右側的點才是后綴的點 -- 字串查找某個字串rfind
index = old_name.find('.')
# 4. 進行優化:有效檔案才備份 .txt這個檔案名就不是有效的
if index > 0:
# 提取后綴
postfix = old_name[index:]
# 2.2 組織新名字 = 原名字 + [備份] + 后綴
# 原名字就是字串的一部分字串 -- 切片[開始:結束:步長]
print(old_name[:index]) # 開始從0開始,可以省略不用寫
print(old_name[index:]) # 因為提取到最后,所以后面可以省略
# new_name = old_name[:index] + '[備份]' + old_name[index:]
new_name = old_name[:index] + '[備份]' + postfix # 如果用戶輸入的檔案名不符合,則會報錯
print(new_name)
# 3. 備份檔案匯入資料(資料和源檔案一樣)
# 對于計算機來講,我們存盤什么,對于底層,他都是以二進制形式做的存盤以及操作,用二進制打開沒有問題的,
# 3.1 打開原檔案和備份原檔案
old_f = open(old_name, 'rb')
new_f = open(new_name,'wb')
# 3.2 原檔案讀取,備份檔案寫入
# 如果不確定目標檔案大小,回圈讀取寫入,當讀取出來的資料沒有了,終止回圈
while True:
con = old_f.read(1024)
if len(con) == 0:
# 表示讀取完成了
break
new_f.write(con)
# 3.3 關閉檔案
old_f.close()
new_f.close()
12.7 檔案和檔案夾的操作
使用os模塊的一些方法,來進行檔案和檔案夾的操作
'''
在python中要操作檔案和檔案夾的話,要借助模塊,要借助os模塊,
1. 匯入模塊os
2. 使用模塊內功能
'''
import os # 匯入模塊,借助os模塊里面的相關功能,使用os模塊相關功能:os.函式名()
# 1. rename(目標檔案,新檔案名): 重命名
# rename的第一個引數其實是路徑,因為這里直接在當前目錄下,所以直接寫的檔案名
# os.rename('1.txt','1000.txt') # 此時檔案已經改名
# 2. remove(目標檔案名)
# os.remove('1000.txt') # 此時1000.txt檔案已經洗掉,如果要洗掉的檔案不存在則會報錯
# 3. mkdir(檔案夾名字):創建檔案夾 也可以帶路徑的檔案夾名字
# os.mkdir('aa') # 創建檔案夾成功
# 4.rmdir(檔案夾名字): 洗掉檔案夾
# os.rmdir('aa') # 洗掉成功
# 5. getcwd():回傳當前檔案所在目錄路徑
print(os.getcwd()) # 輸出 D:\PycharmProjects\pythonProject11
# 6. chdir(目錄)改變目錄路徑
# os.mkdir('aa') # 創建aa檔案夾
# 需求:在aa里面創建bb檔案夾:1. 切換目錄到aa 2.在aa檔案夾中創建bb
# os.chdir('aa') # 切換到aa檔案夾
# os.mkdir('bb') # 在檔案夾中創建bb
# 7. listdir(目錄): 獲取某個檔案夾下所有檔案,回傳一個串列
# print(os.listdir()) # 如果沒有填寫目錄,那么顯示當前檔案所在的檔案夾下所有檔案
# print(os.listdir('aa')) # 獲取aa檔案夾下所有的資料
# 8. rename(目標檔案名,新檔案名) -- 重命名檔案夾 aa重命名為aaaa
os.rename('aa','aaaa')
12.8 批量重命名
看個栗子,就懂了,用到了回圈
# 需求1:把code檔案夾所有檔案重命名 Python xxxx
import os
# 1. 找到所有檔案:獲取code檔案夾的目錄串列 -- listdir()
file_list = os.listdir()
print(file_list)
# 2. 構造名字
for i in file_list:
new_name = 'Python_' + i
# 3.重命名
os.rename(i, new_name) # 改名成功
檔案夾重命名進行優化,用flag來控制檔案名的修改
# 需求2:洗掉Python_ 重命名:1.構造條件的資料 2.書寫if
import os
# 構造條件的資料
flag = 2
# 1. 找到所有檔案:獲取code檔案夾的目錄串列 -- listdir()
file_list = os.listdir()
print(file_list)
# 2. 構造名字
for i in file_list:
if flag == 1:
new_name = 'Python_' + i
elif flag == 2:
# 洗掉資料
num = len('Python_')
new_name = i[num:]
# 3.重命名
os.rename(i, new_name) # 改名成功
12.9 小總結
檔案操作小總結
'''
r檔案指標在開頭,能讀取出來資料
w檔案指標在開頭,會把原內容覆寫掉
a檔案指標在結尾,向右讀取不出來資料,想要a模式能讀取出來資料,用seek()改變檔案指標位置
可以重命名檔案也可以重命名檔案夾
'''
"""
檔案操作步驟
打開:檔案物件 = open(目標檔案,訪問模式)
操作:
1.讀
檔案物件.read()
檔案物件.readlines()
檔案物件.readline()
2.寫
檔案物件.write()
改變指標:seek()
關閉: 檔案物件.close
主訪問模式
w:寫,檔案不存在則新建該檔案
r:讀,檔案不存在則報錯
a:追加
檔案和檔案夾操作
重命名:os.rename 可以重命名檔案也可以重命名檔案夾
獲取當前目錄路徑:os.getcwd()
獲取目錄串列:os.listdir()
"""
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/159722.html
標籤:其他
