Python的路徑操作(os模塊與pathlib模塊)
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
一.os.path模塊(Python 3.4版本之前推薦使用該模塊)
#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ #EMAIL:y1053419035@qq.com from os import path p = path.join("C:\Windows","System32","drivers","etc") print(type(p),p) print(path.exists(p)) #判斷路徑p是否存在 print(path.split(p)) #將路徑進行切分,需要注意的是,windows和Linux切分方式可能不太一樣 print(path.abspath(".")) #打印當前的絕對路徑 print(path.join("/",p,"hosts")) #將路徑進行拼接 print(path.dirname(p)) #父目錄 print(path.basename(p)) #最末層的目錄 print(path.splitdrive(p)) #獲取驅動器名稱,該方法一般用在windows操作系統,可以一目了然的看出來某目錄的驅動器名稱 #以上代碼輸出結果如下: <class 'str'> C:\Windows\System32\drivers\etc True ('C:\\Windows\\System32\\drivers', 'etc') D:\Python\project\自動化運維\yinzhengjie_devops\day007 C:\Windows\System32\drivers\etc\hosts C:\Windows\System32\drivers etc ('C:', '\\Windows\\System32\\drivers\\etc')

#!/usr/bin/env python #_*_coding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ #EMAIL:y1053419035@qq.com from os import path p1 = path.abspath(__file__) print(p1,path.basename(p1)) while p1 != path.dirname(p1): p1 = path.dirname(p1) print(p1,path.basename(p1)) #以上代碼輸出結果如下: D:\Python\project\自動化運維\yinzhengjie_devops\day007\01.path模塊.py 01.path模塊.py D:\Python\project\自動化運維\yinzhengjie_devops\day007 day007 D:\Python\project\自動化運維\yinzhengjie_devops yinzhengjie_devops D:\Python\project\自動化運維 自動化運維 D:\Python\project project D:\Python Python D:\
二.pathlib模塊(Python 3.4版本開始建議使用pathlib模塊,提供Path對象來操作。包括目錄和文件)
1>.初始化
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 """ 8 Python3.4版本開始,建議使用pathlib模塊,提供Path對象來操作,包括目錄和文件 9 """ 10 11 from pathlib import Path 12 13 14 p1 = Path() #當前目錄 15 16 p2 = Path('a','b','c\d') #當前目錄下的"a\b\c\d",我是在windows下執行的代碼 17 18 p3 = Path('/etc') #根下的etc目錄 19 20 21 print("p1 = {}".format(p1)) 22 print("p2 = {}".format(p2)) 23 print("p3 = {}".format(p3)) 24 25 26 27 #以上代碼執行結果如下: 28 p1 = . 29 p2 = a\b\c\d 30 p3 = \etc
2>.parts和joinpath屬性
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 """ 8 Python3.4版本開始,建議使用pathlib模塊,提供Path對象來操作,包括目錄和文件 9 """ 10 11 from pathlib import Path 12 13 p = Path() 14 15 p = p / 'a' 16 17 p1 = 'b' / p 18 19 p2 = Path('c') 20 21 p3 = p2 / p1 22 23 print(p3.parts) #分解操作,可以返回路徑中的每一個部分 24 25 p4 = p3.joinpath('etc','init.d',Path('httpd')) #連接多個字符串到Path對象中 26 27 print("p1 = {},\t p1.parts = {}".format(p1,p1.parts)) 28 print("p2 = {},\t p2.parts = {}".format(p2,p2.parts)) 29 print("p3 = {},\t p3.parts = {}".format(p3,p3.parts)) 30 print("p4 = {},\t p4.parts = {}".format(p4,p4.parts)) 31 32 33 34 35 #以上代碼執行結果如下: 36 ('c', 'b', 'a') 37 p1 = b\a, p1.parts = ('b', 'a') 38 p2 = c, p2.parts = ('c',) 39 p3 = c\b\a, p3.parts = ('c', 'b', 'a') 40 p4 = c\b\a\etc\init.d\httpd, p4.parts = ('c', 'b', 'a', 'etc', 'init.d', 'httpd')
3>.獲取路徑
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 """ 8 Python3.4版本開始,建議使用pathlib模塊,提供Path對象來操作,包括目錄和文件 9 """ 10 11 from pathlib import Path 12 13 14 p1 = Path("C:\Windows\System32\drivers\etc\hosts") 15 16 print(str(p1)) #獲取路徑字符串 17 18 print(bytes(p1)) #獲取路徑字符串的bytes 19 20 21 22 #以上代碼執行結果如下: 23 C:\Windows\System32\drivers\etc\hosts 24 b'C:\\Windows\\System32\\drivers\\etc\\hosts'
4>.父目錄
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 """ 8 Python3.4版本開始,建議使用pathlib模塊,提供Path對象來操作,包括目錄和文件 9 """ 10 11 from pathlib import Path 12 13 14 p1 = Path("C:\Windows\System32\drivers\etc\hosts") 15 16 print(p1.parent.parent) #目錄的邏輯父目錄 17 18 19 for item in p1.parents: #父目錄序列,索引0是直接的父目錄 20 print(item) 21 22 23 24 #以上代碼執行結果如下: 25 C:\Windows\System32\drivers 26 C:\Windows\System32\drivers\etc 27 C:\Windows\System32\drivers 28 C:\Windows\System32 29 C:\Windows 30 C:\
5>.name,stem,suffix,suffixes.with_suffix(fuffix),with_name(name)
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 """ 8 Python3.4版本開始,建議使用pathlib模塊,提供Path對象來操作,包括目錄和文件 9 """ 10 11 from pathlib import Path 12 13 14 p1 = Path("C:\Windows\System32\drivers\etc\hosts.txt") 15 16 print(p1.name) #獲取目錄的最后一個部分 17 print(p1.suffix) #目錄中最后一個部門的擴展名稱,可以為空 18 print(p1.suffixes) #返回多個擴展名列表 19 print(p1.stem) #目錄最后一個部分,沒有后綴 20 print(p1.with_name("protocol")) #替換目錄最后一個部分並返回一個新的路徑 21 22 p2 = Path("C:\Windows\System32\drivers\etc\services") 23 print(p2.with_suffix(".txt")) #補充擴展名到路徑末尾,返回新的路徑,擴展名存在則無效 24 25 26 27 #以上代碼執行結果如下: 28 hosts.txt 29 .txt 30 ['.txt'] 31 hosts 32 C:\Windows\System32\drivers\etc\protocol 33 C:\Windows\System32\drivers\etc\services.txt
6>.目錄的常用方法
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 """ 8 Python3.4版本開始,建議使用pathlib模塊,提供Path對象來操作,包括目錄和文件 9 10 cwd() 11 返回當前工作目錄 12 home() 13 返回當前家目錄 14 is_dir() 15 是否是目錄,目錄存在返回True 16 is_file() 17 是否是普通文件,文件存在返回True 18 is_symlink() 19 是否是軟連接 20 is_socket() 21 是否是socket文件 22 is_block_device() 23 是否是塊設備 24 is_char_device() 25 是否是字符設備 26 is_absolute() 27 是否是絕對路徑 28 resolve() 29 返回一個新的路徑,這個新路徑就是當前Path對象的絕對路徑,如果是軟連接則直接被解析 30 absolute() 31 也可以獲取絕對路徑,但是推薦使用resolve() 32 exists() 33 目錄或文件是否存在 34 rmdir() 35 刪除空目錄。沒有提供判斷目錄為空的方法 36 touche(mode=0o666,exist_ok=True) 37 創建一個文件 38 as_uri() 39 將目錄返回成URL,例如:"file:///etc/hosts" 40 mkdir(mode=0o777,partents=False,exist_ok=Flase) 41 parents,是否創建父目錄,True等同於mkdir -p;Flase時,父目錄不存在,則拋出FileNotFountError,exist_ok參數,在3.5版本加入。Flase時,路徑存在,拋出FileExistsError;True時,FileExistsError被忽略。 42 iterdir() 43 迭代當前目錄 44 """ 45 46 from pathlib import Path 47 48 49 p1 = Path() 50 51 p1 /= 'a/b/c/d' 52 53 p1.exists() 54 55 #創建目錄 56 # p1.mkdir() #FileNotFoundError 57 58 p1.mkdir(parents=True) 59 p1.exists() 60 61 p1.mkdir(parents=True,exist_ok=True) 62 63 p1 /= "README.txt" 64 65 p1.parent.rmdir() 66 67 p1.parent.exists() 68 69 # p1.mkdir() #FileNotFoundError 70 71 p1.mkdir(parents=True) 72 73 74 #遍歷,並判斷文件類型,如果是目錄是否可用判斷其為空 75 for x in p1.parents[len(p1.parents)-1].iterdir(): 76 print(x,end='\t') 77 if x.is_dir(): 78 flag = False 79 for _ in x.iterdir(): 80 flag = True 81 break 82 print("dir", "Not Empty" if flag else "Empyt", sep='\t') 83 elif x.is_file(): 84 print("file") 85 else: 86 print("other file")
7>.通配符
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 """ 8 Python3.4版本開始,建議使用pathlib模塊,提供Path對象來操作,包括目錄和文件 9 10 glob(pattern) 11 通配符給定的模式 12 rglob(pattern) 13 通配符給定的模式,遞歸目錄,返回一個生成器 14 """ 15 16 from pathlib import Path 17 18 19 p1 = Path("C:\Windows\System32\drivers\etc") 20 21 print(list(p1.glob("host*"))) #返回當前目錄對象下的以host開頭的文件 22 23 print(list(p1.glob("**/*.ddl"))) #遞歸所有目錄,等同於rglob 24 25 g = p1.rglob('host*') #生成器 26 27 for _ in g: 28 print(next(g)) 29 30 31 32 #以上代碼執行結果如下: 33 [WindowsPath('C:/Windows/System32/drivers/etc/hosts'), WindowsPath('C:/Windows/System32/drivers/etc/hosts.dz')] 34 [] 35 C:\Windows\System32\drivers\etc\hosts.dz
8>.匹配
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 """ 8 Python3.4版本開始,建議使用pathlib模塊,提供Path對象來操作,包括目錄和文件 9 10 match(pattern) 11 模式匹配,成功返回True 12 """ 13 14 from pathlib import Path 15 16 p1 = Path('D:\Python\project\yinzhengjie_devops\day007\01.pathlib_demo.py') 17 18 19 print(p1.match("*.py")) 20 21 print(p1.match("day007\01.pathlib_demo.py")) 22 23 print(p1.match("D:\**\project\**\**\01.pathlib_demo.py")) 24 25 print(p1.match("**\01.pathlib_demo.py")) 26 27 print(p1.match("*\*.py")) 28 29 30 #以上代碼執行結果如下: 31 True 32 True 33 True 34 True 35 True
9>.stat()方法
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 """ 8 Python3.4版本開始,建議使用pathlib模塊,提供Path對象來操作,包括目錄和文件 9 stat() 10 相當於stat命令 11 last()同stat(),但如果是符號鏈接,則顯示符號鏈接本身的文本信息 12 """ 13 14 from pathlib import Path 15 16 p1 = Path("/yinzhengjie/softwares/mysql-5.7.25-linux-glibc2.12-x86_64") 17 18 print(p1.stat()) 19 20 p2 = Path("/yinzhengjie/softwares/mysql") 21 22 print(p2.stat()) 23 24 print(p2.lstat())
10>.文件操作
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/ 5 #EMAIL:y1053419035@qq.com 6 7 8 """ 9 Python3.4版本開始,建議使用pathlib模塊,提供Path對象來操作,包括目錄和文件 10 11 open(self, mode='r', buffering=-1, encoding=None,errors=None, newline=None) 12 使用方法類似內奸函數open,返回一個文件對象。 13 14 15 Python3.5增加的新函數 16 read_bytes() 17 以"rb"讀取路徑對應文件,並返回二進制流,可通過IDE去看源碼。 18 read_text(encoding=None,error=None) 19 以"rt"方式讀取路徑對應文件,返回文本 20 write_bytes(data) 21 以"wb"方式寫入數據到路徑對應文件 22 write_text(data,encoding=None,errors=None) 23 以"wt"方式寫入字符串到路徑對應文件。 24 """ 25 from pathlib import Path 26 27 p1 = Path("my_binary_file") 28 29 p1.write_bytes(b"https://www.cnblogs.com/yinzhengjie") 30 31 print(p1.read_bytes()) 32 33 p2 = Path("my_text_file") 34 35 p2.write_text("https://www.cnblogs.com/yinzhengjie") 36 37 print(p2.read_text()) 38 39 with p2.open() as f: 40 print(f.read(5)) 41 42 43 44 #以上代碼執行結果如下: 45 b'https://www.cnblogs.com/yinzhengjie' 46 https://www.cnblogs.com/yinzhengjie 47 https
三.os模塊其它常用方法
1 #!/usr/bin/env python 2 #_*_conding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie 5 6 import os,sys 7 8 9 path = r"C:\Windows\System32\drivers\etc" 10 11 print(os.name) #windows是nt,Linux是posix。 12 13 # print(os.uname()) #unix/linux系統支持 14 15 print(sys.platform) #windows顯示win32,Linux顯示Linux 16 17 print(os.listdir(path)) #返回指定目錄內容列表,不遞歸 18 19 p1 = path + r"\hosts" 20 print(os.stat(p1)) 21 22 # print(os.chmod(p1,0O77)) #和Linux操作系統的chmod命令類似 23 # print(os.chown(p1,uid=0,gid=0)) #和Linux操作系統的chown命令類似,可以改變文件的屬主,屬組,但需要足夠的權限 24 25 """ 26 os模塊除了上面列舉的還有很多,感興趣的小伙伴可以在這個模塊里找類似需求的方法,滿足我們平時的開發基本上問題不大。 27 對了,os模塊也有open,read,write等方法,但是太底層,建議使用內建函數open,read,write,使用方法相似。 28 """