Python的路徑操作(os模塊與pathlib模塊)


           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 """

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM