一篇文章搞定Python操作文件與目錄
前言
文件和目錄操作是很常見的功能,這里做個(gè)簡(jiǎn)單的總結(jié),包括注意事項(xiàng)和實(shí)際的實(shí)現(xiàn)代碼,基本日常開發(fā)都?jí)蛴昧?br />
目錄操作
判斷目錄或是文件是否存在
os.path.exists(path)
判斷是否是文件或是目錄
# 如果文件或是目錄不存在也會(huì)返回False os.path.isfile(path) os.path.isdir(path)
創(chuàng)建/刪除目錄
os.mkdir(path) os.rmdir(path)
得到當(dāng)前的目錄名稱
os.path.split(dir_path)[1]
這個(gè)方法既簡(jiǎn)單又實(shí)用,比如我們輸入一個(gè)目錄路徑:
os.path.split('/usr/projects/project1')[1] # 輸出 project1 # 實(shí)際上,上面的代碼是分了2步走: # 第1步:利用os.path.split方法分割路徑 os.path.split('/usr/projects/project1') # 輸出 ('/usr/projects', 'project1') # 然后第2步取出第2個(gè)結(jié)果,也就是當(dāng)前的目錄名字
循環(huán)遍歷目錄
循環(huán)遍歷目錄有2種方式,一種是常規(guī)的遞歸方法,類似下面這樣:
def list_file(path): for file in os.listdir(path): if os.path.isdir(os.path.join(path, file)): list_file(os.path.join(path, file)) print(file)
還有一種更好的方式就是用os.walk方法,類似下面這樣:
def list_file_by_walk(dir_path): for home, dirs, files in os.walk(dir_path): print(home) print(dirs) # files中是文件列表 for file_name in files: print(file_name)
os.walk方法的幾個(gè)參數(shù)簡(jiǎn)單介紹一下:
- home:這個(gè)是當(dāng)前遍歷的目錄,比如說是 /usr/projects/
- dirs:是這個(gè)目錄(home目錄)下面的所有文件夾(也就是子目錄)
- files:是這個(gè)目錄(home目錄)下所有的文件
所以從上面的參數(shù)中可以看出,os.walk方法會(huì)逐一地遍歷初始目錄下面的所有目錄和文件
常見的文件操作
跟上面得到目錄名類似的是得到文件的后綴
os.path.splitext(file_path)
這個(gè)方法如果輸入的是文件的路徑,比如:
a = '/usr/projects/project1/test.txt' os.path.splitext(a) # 輸出 ('/usr/projects/project1/test', '.txt') # 所以跟上面類似,我們可以直接拿到文件的后綴 os.path.splitext(a)[1]
文件的全路徑
# 需要文件的目錄路徑和文件名 os.path.join(dir_name, file_name)
這個(gè)方法也很有用,因?yàn)槲覀冊(cè)诖蜷_一個(gè)文件的時(shí)候都需要知道文件的路徑
比如在上面循環(huán)遍歷目錄的例子中,我們可以這樣打開編輯文件:
def list_file_by_walk(dir_path): for home, dirs, files in os.walk(dir_path): print(home) print(dirs) # files中是文件列表 for file_name in files: # 這個(gè)file_name只是一個(gè)文件名 print(file_name) # 如果我們需要打開文件進(jìn)行編輯讀寫操作,那就需要文件的路徑 # 用os.path.join方法就可以快速得到文件路徑 file_path = os.path.join(home, file_name)
需要注意的是,不要直接用字符串相加的方式來拼接,這樣子會(huì)有兼容問題,比如windows上可能路徑就是錯(cuò)的了
讀寫文件
打開文件
with open(file, 'r') as f: for line in f.readlines(): print line
大家只要記住上面打開文件的格式就行了,也就是這句:
with open(file_path, 打開的模式) as f # 我們就拿到了文件對(duì)象f,可以對(duì)文件進(jìn)行操作了,比如讀寫等
原因是文件讀寫是IO操作,需要及時(shí)關(guān)閉打開的文件,上述with open() as f的方式會(huì)自動(dòng)幫你關(guān)閉文件的,免得自己忘記關(guān)
文件的打開模式
文件的打開模式有很多種,比如只讀、只寫、追加模式等等,具體可以見下圖:
文件讀寫模式--來源于網(wǎng)絡(luò)
模式有這么多,掌握常見的幾種就可以了,其他的等用到了再去了解。需要注意以下幾點(diǎn):
創(chuàng)建文件,只需要打開一個(gè)文件即可:
# 只要這樣一句就創(chuàng)建了一個(gè)新文件,也就是打開以后關(guān)閉文件 with open(new_file, 'w') as f:
需要特別注意的是,以w只寫模式打開一個(gè)文件后會(huì)把原文件的內(nèi)容清除!所以如果在遍歷文件的時(shí)候,你想同時(shí)修改文件就不能簡(jiǎn)單的以w只寫模式打開了。
在遍歷文件的時(shí)候想同時(shí)修改文件怎么辦呢?注意這里說的是修改,比如修改某一行。
修改文件的某一部分
這里舉例在遍歷文件的時(shí)候想修改文件,比如以上面遍歷目錄文件的例子:
def list_file_by_walk(dir_path): for home, dirs, files in os.walk(dir_path): print(home) print(dirs) # files中是文件列表 for file_name in files: # 這個(gè)file_name只是一個(gè)文件名 print(file_name) # 如果我們需要打開文件進(jìn)行編輯讀寫操作,那就需要文件的路徑 # 用os.path.join方法就可以快速得到文件路徑 file_path = os.path.join(home, file_name) # 這個(gè)時(shí)候我想修改這個(gè)文件的內(nèi)容,要怎么做呢?
需要注意的是,讀寫模式需要管理文件指針,比較麻煩,寫讀模式,則會(huì)把原先的內(nèi)容都清除,所以都不適合
一種思路是我先以只讀模式打開,然后遍歷文件的內(nèi)容保存起來,比如:
with open(file, 'r') as f: for line in f.readlines(): print line # 這里就可以把文件的內(nèi)容一行行保存起來 # 找到需要修改的行,修改以后保存
保存以后再以只讀模式打開文件,寫入即可。
另一種思路是我打開原文件的同時(shí),再打開另一個(gè)臨時(shí)文件用于寫入,比如這樣:
with open(file, 'r') as f, open(cache_file_path, 'w') as w: for line in f.readlines(): # 中間可以對(duì)f文件中的內(nèi)容進(jìn)行過濾或是修改 w.write(line) # 完了以后需要?jiǎng)h除原文件,然后把臨時(shí)文件的名字修改成原來文件的名字即可
這里就順道引出了,刪除和重命名文件的方法
os.remove(file) os.rename(cache_file_path, file)
總結(jié)
以上就是Python文件和目錄操作的常用知識(shí)點(diǎn)和方法總結(jié),建議大家收藏起來,以后方便隨時(shí)查看。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Django項(xiàng)目實(shí)戰(zhàn)之用戶頭像上傳與訪問的示例
這篇文章主要介紹了Django項(xiàng)目實(shí)戰(zhàn)之用戶頭像上傳與訪問的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04django 解決model中類寫不到數(shù)據(jù)庫中,數(shù)據(jù)庫無此字段的問題
這篇文章主要介紹了django 解決model中類寫不到數(shù)據(jù)庫中,數(shù)據(jù)庫無此字段的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨想過來看看吧2020-05-05python3通過selenium爬蟲獲取到dj商品的實(shí)例代碼
這篇文章主要介紹了python3通過selenium爬蟲獲取到dj商品的實(shí)例代碼,需要的朋友可以參考下2019-04-04Flask框架響應(yīng)、調(diào)度方法和藍(lán)圖操作實(shí)例分析
這篇文章主要介紹了Flask框架響應(yīng)、調(diào)度方法和藍(lán)圖操作,結(jié)合實(shí)例形式分析了Flask框架中響應(yīng)、調(diào)度方法和藍(lán)圖相關(guān)功能、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2018-07-07Python10行代碼實(shí)現(xiàn)模擬百度搜索的示例
本文主要介紹了Python10行代碼實(shí)現(xiàn)模擬百度搜索的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07python?include標(biāo)簽的使用方式及說明
這篇文章主要介紹了python?include標(biāo)簽的使用方式及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03Django在admin后臺(tái)集成TinyMCE富文本編輯器的例子
今天小編就為大家分享一篇Django在admin后臺(tái)集成TinyMCE富文本編輯器的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python自動(dòng)化辦公之生成PDF報(bào)告詳解
因?yàn)楣ぷ餍枰?jīng)常需要生成很多的PDF報(bào)告給客戶查看產(chǎn)品效果以及過程的講解,每次都需要按照一定的格式的編寫文檔并生成PDF報(bào)告,這樣重復(fù)性的工作實(shí)在太累。本文就來用Python實(shí)現(xiàn)自動(dòng)生成PDF報(bào)告吧2023-03-03