1. 程式人生 > 實用技巧 >Python3的系統標準庫pathlib模組的 Path 對路徑的操作會更簡單

Python3的系統標準庫pathlib模組的 Path 對路徑的操作會更簡單

而到了Python3時代後,Python3的系統標準庫pathlib模組的 Path 對路徑的操作會更簡單。甚至可以說pathlib已經可以完全替代os.path,它完全採用面向物件的程式設計方式,因為Python 文件給它的定義是 Object-oriented filesystem paths(面向物件的檔案系統路徑),其語義適用於不同的作業系統,它繼承純路徑但也提供I/O化操作,在處理配置路徑方面十分簡單。

這裡要特殊說明下,我們所有的例子中都匯入了pathlib2模組而不是pathlib模組,因為簡單引用官方的話說就是老版本的pathlib模組已經只作為修復bug模式存在,而新版本的pathlib2是以修補更新的pathlib2而釋出的,而且所有的新功能都可以相容過去的舊版本python。

好了,來讓我們看下常用的pathlib操作的例子彙總:

返回當前工作目錄路徑和Home路徑

在pathlib裡一切都是面向物件的,只需要呼叫指定的方法就可以了。

from pathlib2 import Path

# 獲取當前目錄
current_path = Path.cwd()
print(current_path)

# 輸出如下:
# /Users/Anders/Documents/

# 獲取Home目錄
home_path = Path.home()
print(home_path)

# 輸出如下:
# /Users/Anders
父目錄操作

你可以看到想要獲取一個路徑下上級的父目錄可以非常方便的直接使用面向物件的方式**.parent**就行了,如果還想上一級就繼續以子物件繼續操作parent屬性就可以了。

from pathlib2 import Path

# 獲取當前目錄
current_path = Path.cwd()

# 獲取上級父目錄
print(current_path.parent)

# 獲取上上級父目錄
print(current_path.parent.parent)

# 獲取上上上級父目錄
print(current_path.parent.parent.parent)

# 獲取上上上上級父目錄
print(current_path.parent.parent.parent.parent)

# 獲取上上上上級父目錄
print(current_path.parent.parent.parent.parent.parent)

# 輸出如下:
# /Users/Anders/Documents/Jupyter
# /Users/Anders/Documents
# /Users/Anders
# /Users
# /

當然路徑是十分長的,而且在特定的場合我如果想獲得每一級的父目錄呢,貼心的pathlib已經幫我們想到了,使用parents屬性就可以遍歷整個父目錄了,如下例子的效果和上面的例子是完全一樣的,但是就變的非常簡便。

# 獲取當前目錄
from pathlib2 import Path

current_path = Path.cwd()

for p in current_path.parents:
    print(p)

# 輸出如下:
# /Users/Anders/Documents/Jupyter
# /Users/Anders/Documents
# /Users/Anders
# /Users
# /

常用的檔名操作屬性如下:

  • name目錄的最後一個部分

  • suffix目錄中最後一個部分的副檔名

  • suffixes返回多個副檔名列表

  • stem目錄最後一個部分,沒有後綴

  • with_name(name)替換目錄最後一個部分並返回一個新的路徑

  • with_suffix(suffix)替換副檔名,返回新的路徑,副檔名存在則不變

from pathlib2 import Path

# 返回目錄中最後一個部分的副檔名
example_path = Path('/Users/Anders/Documents/abc.gif')
print(example_path.suffix)
# 輸出如下:
# .gif

# 返回目錄中多個副檔名列表
example_paths = Path('/Users/Anders/Documents/abc.tar.gz')
print(example_paths.suffixes)
# 輸出如下:
# ['.tar', '.gz']

# 返回目錄中最後一個部分的檔名(但是不包含字尾)
example_path = Path('/Users/Anders/Documents/abc.gif')
print(example_path.stem)
# 輸出如下:
# abc

# 返回目錄中最後一個部分的檔名
example_path = Path('/Users/Anders/Documents/abc.gif')
print(example_path.name)
# 輸出如下:
# abc.gif

# 替換目錄最後一個部分的檔名並返回一個新的路徑
new_path1 = example_path.with_name('def.gif')
print(new_path1)
# 輸出如下:
# /Users/Anders/Documents/def.gif

# 替換目錄最後一個部分的檔名並返回一個新的路徑
new_path2 = example_path.with_suffix('.txt')
print(new_path2)
# 輸出如下:
# /Users/Anders/Documents/abc.txt
路徑拼接和分解
from pathlib2 import Path

#直接傳進一個完整字串
example_path1 = Path('/Users/Anders/Documents/powershell-2.jpg')

#也可以傳進多個字串
example_path2 = Path('/', 'Users', 'dongh', 'Documents', 'python_learn', 'pathlib_', 'file1.txt')

#也可以利用Path.joinpath()
example_path3 = Path('/Users/Anders/Documents/').joinpath('python_learn')

# #利用 / 可以建立子路徑
example_path4 = Path('/Users/Anders/Documents')
example_path5 = example_path4 / 'python_learn/pic-2.jpg'

遍歷資料夾

我們可以在路徑物件後面直接使用**iterdir()**方法,該方法返回一個生成器,我們可以迴圈遍歷出所有指定目錄下的目錄路徑。

from pathlib2 import Path

# 返回目錄中最後一個部分的副檔名
example_path = Path('/Users/Anders/Documents')
[path for path in example_path.iterdir()]

# 輸出如下:
# [PosixPath('/Users/Anders/Documents/abc.jpg'),
#  PosixPath('/Users/Anders/Documents/book-master'),
#  PosixPath('/Users/Anders/Documents/Database'),
#  PosixPath('/Users/Anders/Documents/Git'),
#  PosixPath('/Users/Anders/Documents/AppProjects')]

檔案操作

檔案操作是使用率非常高的操作,在pathlib裡如果要開啟一個檔案也十分的簡單,只需要open方法就可以,它的操作語法是:open(mode=‘r’, bufferiong=-1, encoding=None, errors=None, newline=None)

from pathlib2 import Path

example_path = Path('/Users/Anders/Documents/information/JH.txt')

with example_path.open(encoding = 'GB2312') as f:
    print(f.read())

對於簡單的檔案讀寫,在pathlib庫中有幾個簡便的方法:

  • .read_text(): 以文字模式開啟路徑並並以字串形式返回內容。
  • .read_bytes(): 以二進位制/位元組模式開啟路徑並以位元組串的形式返回內容。
  • .write_text(): 開啟路徑並向其寫入字串資料。
  • .write_bytes(): 以二進位制/位元組模式開啟路徑並向其寫入資料。

比如可以把之前的例子改寫如下:

from pathlib2 import Path

example_path = Path('/Users/Anders/Documents/information/JH.txt')
example_path.read_text(encoding='GB2312')

建立資料夾和刪除資料夾

關於這裡的建立檔案目錄mkdir方法接收兩個引數:

  • parents:如果父目錄不存在,是否建立父目錄。
  • exist_ok:只有在目錄不存在時建立目錄,目錄已存在時不會丟擲異常。
from pathlib2 import Path

example_path = Path('/Users/Anders/Documents/test1/test2/test3')

# 建立檔案目錄,在這個例子中因為本身不存在test1,test2,test3,由於parents為True,所以都會被創建出來。
example_path.mkdir(parents = True, exist_ok = True)
# 刪除路徑物件目錄,如果要刪除的資料夾內包含檔案就會報錯
example_path.rmdir()

判斷檔案及資料夾物件是否存在

關於檔案的判斷還有很多相關屬性,羅列如下:

  • is_dir()是否是目錄

  • is_file()是否是普通檔案

  • is_symlink()是否是軟連結

  • is_socket()是否是socket檔案

  • is_block_device()是否是塊裝置

  • is_char_device()是否是字元裝置

  • is_absolute()是否是絕對路徑

  • resolve()返回一個新的路徑,這個新路徑就是當前Path物件的絕對路徑,如果是軟連結則直接被解析

  • absolute()也可以獲取絕對路徑,但是推薦resolve()

  • exists()該路徑是否指向現有的目錄或檔案:

部分例子可以參照下面:

from pathlib2 import Path

example_path = Path('/Users/Anders/Documents/pic-2.jpg')

# 判斷物件是否存在
print(example_path.exists())
# 輸出如下:
# True

# 判斷物件是否是目錄
print(example_path.is_dir())
# 輸出如下:
# False

# 判斷物件是否是檔案
print(example_path.is_file())
# 輸出如下:
# True
檔案的資訊

只需要通過**.stat()**方法就可以返還指定路徑的檔案資訊。

from pathlib2 import Path

example_path = Path('/Users/Anders/Documents/pic.jpg')
print(example_path.stat())
# 輸出如下:
# os.stat_result(st_mode=33188, st_ino=8598206944, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=38054, st_atime=1549547190, st_mtime=1521009880, st_ctime=1521009883)

print(example_path.stat().st_size)
# 輸出如下:
# 38054

路徑處理庫pathlib使用詳解_Anders's Blog-CSDN部落格

如上,已經基本列舉了路徑處理中常用的各類操作,其實pathlib的方便和強大遠不止於此,具體資訊可以參見官方文件
https://docs.python.org/3.4/library/pathlib.html