1. 程式人生 > 程式設計 >Python檔案路徑名的操作方法

Python檔案路徑名的操作方法

1 檔案路徑名操作

  對於檔案路徑名的操作在程式設計中是必不可少的,比如說,有時候要列舉一個路徑下的檔案,那麼首先就要獲取一個路徑,再就是路徑名的一個拼接問題,通過字串的拼接就可以得到一個路徑名。Python中3.4版本前使用os.path模組中的函式來操作路徑名;3.4版本開始提供pathlib模組,使用Path物件來對目錄和檔案進行操作。

2 os.path模組

from os import path
p = path.join('/etc','sysconfig','network')  # 根據不同的系統,將每個字串組合成路徑形式
print(type(p),p)
print(path.exists(p))  # 判斷路徑在當前系統中是否存在
print(path.split(p))  # (head,tail)將路徑中的最後一個目錄或者檔案與前面的路徑分開
print(path.abspath('.'))  # 返回當前工作路徑,'.'代表當前路徑
p = path.join('o:/',p,'test.txt')
print(path.dirname(p))  # 取目錄名
print(path.basename(p))  # 取基名
print(path.splitdrive(p))  # 將碟符名和檔案路徑名分開(對於windows有碟符之分,在Linux中沒有碟符)
p1 = path.abspath(__file__)  # 取當前檔案所在的路徑
print(p1,path.basename(p1))
while p1 != path.dirname(p1):  # 每次取上級目錄中的基名
  p1 = path.dirname(p1)
  print(p1,path.basename(p1))

3 pathlib模組

3.1 目錄操作

3.1.1 路徑拼接和分解

操作符"/"對路徑拼接

  “/”操作符可以對兩個Path物件進行拼接、字串和Path物件或者Path物件和字串進行拼接

parts屬性

  parts屬性,可以返回路徑中的每一個部分

joinpath

  joinpath(*other)連線多個字串到Path物件中

from pathlib import Path
p = Path()  # 返回當前目錄
p = Path('a','b','c/d')  # 當前目錄下的a/b/c/d
p = Path('/etc')  # 返回根下的etc目錄
p = Path()
p = p / 'a'
p1 = 'b' / p
p2 = Path('c')
p3 = p2 / p1
print(p3.parts)
p3.joinpath('etc','init.d',Path('httpd'))

3.1.2 獲取路徑

  • str獲取路徑字串
  • bytes獲取路徑字串的bytes
 p = Path('/etc')
print(str(p),bytes(p))

3.1.3 獲取路徑中的父目錄

  • parent屬性返回目錄的邏輯父目錄
  • parents屬性返回父目錄序列,索引0是直接的父目錄
p = Path('/a/b/c/d')
 print(p.parent.parent) # 返回當前路徑的父目錄的父目錄即/a/b
 for x in p.parents:   # 將當前路徑的每一級的父目錄序列化
   print(x)

3.1.4 其他屬性及方法

屬性 含義
name 目錄的最後一個部分
stem  目錄最後一個部分,不包含字尾
suffix 目錄中最後一個部分的副檔名
suffixes 返回多個副檔名列表

和以上四個屬性相關的方法:

  •   with_suffix(suffix)補充副檔名到路徑尾部,返回新的路徑,副檔名存在則修改之
  •   with_name(name)替換目錄最後一個部分並返回一個新的路徑
p = Path('/viktor/mysqlinstall/mysql.tar.gz')
print(p.name)  # mysql.tar.gz
print(p.suffix)  # .gz
print(p.suffixes)  # ['.tar','.gz']
print(p.stem)  # mysql.tar
print(p.with_name('mysql-5.tgz'))  # /viktor/mysqlinstall/mysql-5.tgz
p = Path('README')
print(p.with_suffix('.txt'))  # README.txt

和檔案型別相關的方法:

方法 功能
is_dir() 是否是目錄,目錄存在返回True
is_file() 是否是普通檔案,檔案存在返回True
is_symlink() 是否軟連結
is_socket() 是否是socket檔案
is_block_device() 是否是塊裝置
is_char_device() 是否是字元裝置
is_absolute() 是否是絕對路徑

其他幾種方法:

方法 功能
cwd() 返回當前工作目錄
home() 返回當前家目錄
resolve() 

返回一個新的路徑,這個新路徑就是當前Path物件的絕對路徑。

如果是軟連結則直接被解析

absolute() 也可以獲取絕對路徑,但是推薦使用resolve()
exists() 判斷目錄或檔案是否存在
rmdir() 刪除空目錄。沒有提供判斷目錄為空的方法

touch(mode=0o666,

exist_ok=True)

建立一個檔案
as_url() 將路徑返回成URL,例如'file:///etc/passwd'

mkdir(mode=0o777,

parents=False,

exists_ok=False)

parents引數是判斷是否建立父目錄,True等同於mkdir -p;

False時,父目錄不存在,則丟擲FileNotFoundError

exist_ok引數,在3.5版本加入。False時,路徑存在,

丟擲FileExistsError;True時,FileExistsError被忽略

iterdir() 迭代當前目錄

p = Path()
p /= 'a/b/c/d'
p.exists()  # True

# 建立目錄
p.mkdir()  # 如果p物件的路徑存在丟擲FileExistsError,否則丟擲FileNotFoundError
p.mkdir(parents=True)  
p.exists()  # True
p.mkdir(parents=Ture)  # 丟擲FileExistsError
p.mkdir(parents=True,exist_ok=True)  # 忽略FileExistsError
p /= 'readme.txt'
p.parent.rmdir()  # 刪除readme.txt的父目錄,此時真實目錄中已經不存在d目錄
p.parent.exists()  # False 'a/b/c'
p.mkdir()  # FileNotFoundError
p.mkdir(parent=True)  # 成功

 實現遍歷,並判斷檔案型別,如果是目錄是否可以判斷其是否為空的程式碼:

for x in p.parents[len(p.parents)-1].iterdir():
  print(x,end='\t')
  if x.is_dir():
    flag = False
    for _ in x.iterdir():
      flag = True
      break
    print('dir','Not Empty' if flag else 'Empty',sep='\t')
  elif x.is_file():
    print('file')
  else:
    print('other file')

3.2 檔案操作

  pathlib中的Path還提供open(mode='r',buffering=-1,encoding=None,errors=None,newline=None)方法開啟檔案,其使用方法類似內建函式open,返回一個檔案物件。Ptyhon3.5後pathlib模組新增加了一些方法,如下所示:

方法 功能
read_bytes() 以‘rb'讀取路徑對應檔案,並返回二進位制流

read_text(encoding=None,

errors=None)

以'rt'方式讀取路徑對應檔案,返回文字
Path.write_bytes(data) 以'wb'方式寫入資料到路徑對應檔案

write_text(data,

errors=None)

以'wt'方式寫入字串到路徑對應檔案

p = Path("my_binary_file")
p.write_bytes(b'Binary file contents')  # 以'wb'形式向p路徑物件寫入資料
p.read_bytes()

p = Path("my_text_file")
p.write_text('Text file contents')  # 以'wt'形式向p路徑物件寫入資料
p.read_text()

with p.open() as f:
  print(f.read(5))

總結

以上所述是小編給大家介紹的Python檔案路徑名的操作方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!