1. 程式人生 > >Python中路徑操作

Python中路徑操作

目錄

1. os.path模組

3.4版本之前使用os.path模組,3.4版本之後建議使用pathlib模組

方法 解釋
path.join 拼接一個路徑出來
path.exists 判斷該路徑是否存在
path.split 將路徑切割成頭和尾的一個元組
path.abspath 返回一個絕對路徑
path.dirname 返回‘目錄’
path.basename 返回路徑的最後一部分
>>> from os import path
>>> p = path.join('/usr','local/httpd/httpd.conf')
>>> p
'/usr/local/httpd/httpd.conf'
>>> type(p)
<class 'str'>
>>> path.dirname(p)
'/usr/local/httpd'
>>> path.basename(p)
'httpd.conf'
>>> path.split(p)
('/usr/local/httpd', 'httpd.conf')

>>> p
'/etc/local/http/httpd.conf'
>>> while p != path.dirname(p):
...      p = path.dirname(p)
...      print(p,path.basename(p))
... 
/etc/local/http http
/etc/local local
/etc etc
/

2. pathlib模組

from pathlib import Path
Path中返回的是一個Path物件,而os.path中返回的是一個字串。

2.1 目錄操作

初始化:

>>> p = Path() # 當前目錄
>>> p = Path('a','b','c/d') # 當前目錄下的a/b/c/d
>>> p = Path('/etc') # 根下的etc目錄
屬性 解釋
parts 返回路徑中的每一個部分
joinpath 連線多個字串到Path物件中
parent 目錄的邏輯父目錄
parents 父目錄序列,索引0是直接的父
name 目錄中的最後一部分
suffix 目錄中的最後一部分的副檔名
stem 目錄的最後一個部分,沒有後綴
suffixes 返回多個副檔名列表
with_suffix(suffix) 補充副檔名到路徑的尾部,返回新的路徑,副檔名存在則無效
with_name(name) 替換目錄最後一個部分並返回一個新的路徑
>>> p = Path('/usr/local/httpd/httpd.conf')
>>> p.name
'httpd.conf'
>>> p.stem
'httpd'
>>> p.suffix
'.conf'
>>> p.with_name('httpd.txt')
PosixPath('/usr/local/httpd/httpd.txt')
屬性 解釋
cwd() 返回當前工作目錄
home() 返回當前家目錄
is_dir() 是否是目錄
is_file() 是否是普通檔案
is_symlink() 是否是軟連結
is_socket() 是否是socket檔案
is_block_device() 是否是塊裝置
is_absolute() 是否是絕對路徑
resolve() 返回一個新的路徑,該路徑是當前Path的絕對路徑,如果是軟連線則被解析
absolute() 獲取絕對路徑,推薦使用resolve()
exists() 目錄或者檔案是否存在
rmdir() 刪除空目錄,沒有提供判斷目錄為空的方法
touch() 建立一個檔案
as_uri() 將路徑解析成url
mkdir() 建立目錄

判斷目錄:

>>> Path.cwd()
PosixPath('/home/yanfa')
>>> Path.home()
PosixPath('/home/yanfa')
>>> p = Path('/home/yanfa')
>>> p
PosixPath('/home/yanfa')
>>> p.is_dir()
True
>>> p.is_file()
False
>>> p.is_absolute()
True

建立目錄:

>>> p = Path()
>>> p /= 'a/b/c/d'
>>> p.exists()
False
>>> p.mkdir() # FileNotFoundError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/python3.6/lib/python3.6/pathlib.py", line 1248, in mkdir
    self._accessor.mkdir(self, mode)
  File "/usr/local/python3.6/lib/python3.6/pathlib.py", line 387, in wrapped
    return strfunc(str(pathobj), *args)
FileNotFoundError: [Errno 2] No such file or directory: 'a/b/c/d'
>>> p.mkdir(parents=True)
>>> p.exists()
True

萬用字元匹配:

  • glob(pattern) 匹配給定的模式
  • rglob(pattern) 匹配給定的模式,遞迴目錄,返回一個生成器
  • match(pattern) 模式匹配,成功返回True
>>> p = Path()
>>> list(p.glob('h*'))
[PosixPath('h'), PosixPath('hello')]
>>> list(p.glob('**/*.py'))
[PosixPath('pass_py.py')]
>>> g = p.rglob('*.py')
>>> next(g)
PosixPath('pass_py.py')
>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> p = Path('a/b/c/d')
>>> p = Path('a/b/c/ddd.py')
>>> p.match('d*.py')
True
>>> p.match('c/d*.py')
True
>>> p.match('b/*/d*.py')
True

檢視檔案或者目錄屬性資訊

  • stat() 如同linux裡面的stat命令
  • lstst() 同stat(),但是如果是符號連結,就顯示連結本身的資訊

2.2 檔案操作

  • open(mode='r', buffering=-1, encoding=None, errors=None, newline=None如何內建的open,返回一個檔案物件。
  • read_bytes() 以'rb'讀取路徑中對應的檔案,並返回二進位制流。
  • read_text() 以'rt'讀取路徑中對應的檔案,並返回文字。
  • write_bytes(date) 以‘wb’方式寫入資料到路徑對應檔案。
  • write_text(data) 以‘wt’方式寫入資料到路徑對應的檔案。
>>> from pathlib import Path
>>> p = Path('hello')
>>> p.write_text('hello python')
12
>>> p.read_text()
'hello python'
>>> with p.open() as f:
...      print(f.read())
... 
hello python

3. shutil模組

3.1 os模組

  • os.name 返回作業系統
  • os.uname() 顯示當前作業系統的詳細資訊
  • sys.platform 返回當前作業系統
  • os.listdir() 返回目錄內容的列表
  • os.stat() 如何stat
  • os.chmod() 修改檔案的許可權
  • os.chown() 改變檔案的屬主,屬組

3.2 shutil模組

shutil模組提供了對檔案的高階操作,特別是針對檔案的複製和移動。

  • copyfileobj(fsrc, fdst[, length]) 檔案物件的複製,複製內容。
  • copyfile(src, dst, *, follow_symlinks=True) 複製檔案內容,不含元資料
  • copymode() 僅僅複製許可權
  • copystat() 複製元資料,stat包含許可權
  • copy() 複製檔案內容、許可權和部分元資料,不包括建立時間和修改時間
  • rmtree() 遞迴刪除,同rm -rf一樣
  • move(src,dst,copy_function=copy2) 遞迴移動檔案,目錄到目錄路徑。