一文搞定Python操做文件和目錄

本文首發於公衆號「AntDream」,歡迎微信搜索「AntDream」或掃描文章底部二維碼關注,和我一塊兒天天進步一點點windows

文件和目錄操做是很常見的功能,這裏作個簡單的總結,包括注意事項和實際的實現代碼,基本平常開發都夠用了bash

目錄操做

判斷目錄或是文件是否存在

os.path.exists(path)
複製代碼

判斷是不是文件或是目錄

# 若是文件或是目錄不存在也會返回False
os.path.isfile(path)
os.path.isdir(path)
複製代碼

建立/刪除目錄

os.mkdir(path)
os.rmdir(path)
複製代碼

獲得當前的目錄名稱

os.path.split(dir_path)[1]
複製代碼

這個方法既簡單又實用,好比咱們輸入一個目錄路徑:微信

os.path.split('/usr/projects/project1')[1]
# 輸出
project1

# 實際上,上面的代碼是分了2步走:
# 第1步:利用os.path.split方法分割路徑
os.path.split('/usr/projects/project1')
# 輸出
('/usr/projects', 'project1')
# 而後第2步取出第2個結果,也就是當前的目錄名字
複製代碼

循環遍歷目錄

循環遍歷目錄有2種方式,一種是常規的遞歸方法,相似下面這樣:網絡

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方法,相似下面這樣:ui

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方法的幾個參數簡單介紹一下:spa

  • home:這個是當前遍歷的目錄,好比說是 /usr/projects/
  • dirs:是這個目錄(home目錄)下面的全部文件夾(也就是子目錄)
  • files:是這個目錄(home目錄)下全部的文件

因此從上面的參數中能夠看出,os.walk方法會逐一地遍歷初始目錄下面的全部目錄和文件指針

常見的文件操做

跟上面獲得目錄名相似的是獲得文件的後綴

os.path.splitext(file_path)
複製代碼

這個方法若是輸入的是文件的路徑,好比:code

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)
複製代碼

這個方法也頗有用,由於咱們在打開一個文件的時候都須要知道文件的路徑cdn

好比在上面循環遍歷目錄的例子中,咱們能夠這樣打開編輯文件:對象

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:
            # 這個file_name只是一個文件名
            print(file_name)
            # 若是咱們須要打開文件進行編輯讀寫操做,那就須要文件的路徑
            # 用os.path.join方法就能夠快速獲得文件路徑
            file_path = os.path.join(home, file_name)
複製代碼

須要注意的是,不要直接用字符串相加的方式來拼接,這樣子會有兼容問題,好比windows上可能路徑就是錯的了

讀寫文件

打開文件
with open(file, 'r') as f:
    for line in f.readlines():
        print line
複製代碼

你們只要記住上面打開文件的格式就好了,也就是這句:

with open(file_path, 打開的模式) as f
# 咱們就拿到了文件對象f,能夠對文件進行操做了,好比讀寫等
複製代碼

緣由是文件讀寫是IO操做,須要及時關閉打開的文件,上述with open() as f的方式會自動幫你關閉文件的,省得本身忘記關

文件的打開模式

文件的打開模式有不少種,好比只讀、只寫、追加模式等等,具體能夠見下圖:

文件讀寫模式--來源於網絡

模式有這麼多,掌握常見的幾種就能夠了,其餘的等用到了再去了解。須要注意如下幾點:

  • 建立文件,只須要打開一個文件便可:
# 只要這樣一句就建立了一個新文件,也就是打開之後關閉文件
with open(new_file, 'w') as f:
複製代碼
  • 須要特別注意的是,以w只寫模式打開一個文件後會把原文件的內容清除!因此若是在遍歷文件的時候,你想同時修改文件就不能簡單的以w只寫模式打開了。

  • 在遍歷文件的時候想同時修改文件怎麼辦呢?注意這裏說的是修改,好比修改某一行。

修改文件的某一部分

這裏舉例在遍歷文件的時候想修改文件,好比以上面遍歷目錄文件的例子:

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:
            # 這個file_name只是一個文件名
            print(file_name)
            # 若是咱們須要打開文件進行編輯讀寫操做,那就須要文件的路徑
            # 用os.path.join方法就能夠快速獲得文件路徑
            file_path = os.path.join(home, file_name)
            
            # 這個時候我想修改這個文件的內容,要怎麼作呢?
複製代碼

須要注意的是,讀寫模式須要管理文件指針,比較麻煩,寫讀模式,則會把原先的內容都清除,因此都不適合

一種思路是我先以只讀模式打開,而後遍歷文件的內容保存起來,好比:

with open(file, 'r') as f:
    for line in f.readlines():
        print line
        # 這裏就能夠把文件的內容一行行保存起來
        # 找到須要修改的行,修改之後保存
複製代碼

保存之後再以只讀模式打開文件,寫入便可。

另外一種思路是我打開原文件的同時,再打開另外一個臨時文件用於寫入,好比這樣:

with open(file, 'r') as f, open(cache_file_path, 'w') as w:
    for line in f.readlines():
        # 中間能夠對f文件中的內容進行過濾或是修改
        w.write(line)

# 完了之後須要刪除原文件,而後把臨時文件的名字修改爲原來文件的名字便可
複製代碼

這裏就順道引出了,刪除和重命名文件的方法

os.remove(file)
os.rename(cache_file_path, file)
複製代碼

總結

以上就是Python文件和目錄操做的經常使用知識點和方法總結,建議你們收藏起來,之後方便隨時查看。


歡迎關注個人公衆號查看更多精彩文章!
複製代碼

AntDream
相關文章
相關標籤/搜索