Python的路径操作(os模块与pathlib模块)

                                      作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.os.path模块(Python 3.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. from os import path
  8.  
  9. p = path.join("C:\Windows","System32","drivers","etc")
  10.  
  11. print(type(p),p)
  12.  
  13. print(path.exists(p)) #判断路径p是否存在
  14.  
  15. print(path.split(p)) #将路径进行切分,需要注意的是,windows和Linux切分方式可能不太一样
  16.  
  17. print(path.abspath(".")) #打印当前的绝对路径
  18.  
  19. print(path.join("/",p,"hosts")) #将路径进行拼接
  20.  
  21. print(path.dirname(p)) #父目录
  22.  
  23. print(path.basename(p)) #最末层的目录
  24.  
  25. print(path.splitdrive(p)) #获取驱动器名称,该方法一般用在windows操作系统,可以一目了然的看出来某目录的驱动器名称
  26.  
  27. #以上代码输出结果如下:
  28. <class 'str'> C:\Windows\System32\drivers\etc
  29. True
  30. ('C:\\Windows\\System32\\drivers', 'etc')
  31. D:\Python\project\自动化运维\yinzhengjie_devops\day007
  32. C:\Windows\System32\drivers\etc\hosts
  33. C:\Windows\System32\drivers
  34. etc
  35. ('C:', '\\Windows\\System32\\drivers\\etc')
  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. from os import path
  8.  
  9. p1 = path.abspath(__file__)
  10.  
  11. print(p1,path.basename(p1))
  12.  
  13. while p1 != path.dirname(p1):
  14. p1 = path.dirname(p1)
  15. print(p1,path.basename(p1))
  16.  
  17. #以上代码输出结果如下:
  18. D:\Python\project\自动化运维\yinzhengjie_devops\day007\01.path模块.py 01.path模块.py
  19. D:\Python\project\自动化运维\yinzhengjie_devops\day007 day007
  20. D:\Python\project\自动化运维\yinzhengjie_devops yinzhengjie_devops
  21. D:\Python\project\自动化运维 自动化运维
  22. D:\Python\project project
  23. D:\Python Python
  24. 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. p1 = Path() #当前目录
  14.  
  15. p2 = Path('a','b','c\d') #当前目录下的"a\b\c\d",我是在windows下执行的代码
  16.  
  17. p3 = Path('/etc') #根下的etc目录
  18.  
  19. print("p1 = {}".format(p1))
  20. print("p2 = {}".format(p2))
  21. print("p3 = {}".format(p3))
  22.  
  23. #以上代码执行结果如下:
  24. p1 = .
  25. p2 = a\b\c\d
  26. 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. ('c', 'b', 'a')
  34. p1 = b\a, p1.parts = ('b', 'a')
  35. p2 = c, p2.parts = ('c',)
  36. p3 = c\b\a, p3.parts = ('c', 'b', 'a')
  37. 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. p1 = Path("C:\Windows\System32\drivers\etc\hosts")
  14.  
  15. print(str(p1)) #获取路径字符串
  16.  
  17. print(bytes(p1)) #获取路径字符串的bytes
  18.  
  19. #以上代码执行结果如下:
  20. C:\Windows\System32\drivers\etc\hosts
  21. 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. p1 = Path("C:\Windows\System32\drivers\etc\hosts")
  14.  
  15. print(p1.parent.parent) #目录的逻辑父目录
  16.  
  17. for item in p1.parents: #父目录序列,索引0是直接的父目录
  18. print(item)
  19.  
  20. #以上代码执行结果如下:
  21. C:\Windows\System32\drivers
  22. C:\Windows\System32\drivers\etc
  23. C:\Windows\System32\drivers
  24. C:\Windows\System32
  25. C:\Windows
  26. 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. p1 = Path("C:\Windows\System32\drivers\etc\hosts.txt")
  14.  
  15. print(p1.name) #获取目录的最后一个部分
  16. print(p1.suffix) #目录中最后一个部门的扩展名称,可以为空
  17. print(p1.suffixes) #返回多个扩展名列表
  18. print(p1.stem) #目录最后一个部分,没有后缀
  19. print(p1.with_name("protocol")) #替换目录最后一个部分并返回一个新的路径
  20.  
  21. p2 = Path("C:\Windows\System32\drivers\etc\services")
  22. print(p2.with_suffix(".txt")) #补充扩展名到路径末尾,返回新的路径,扩展名存在则无效
  23.  
  24. #以上代码执行结果如下:
  25. hosts.txt
  26. .txt
  27. ['.txt']
  28. hosts
  29. C:\Windows\System32\drivers\etc\protocol
  30. 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. p1 = Path()
  49.  
  50. p1 /= 'a/b/c/d'
  51.  
  52. p1.exists()
  53.  
  54. #创建目录
  55. # p1.mkdir() #FileNotFoundError
  56.  
  57. p1.mkdir(parents=True)
  58. p1.exists()
  59.  
  60. p1.mkdir(parents=True,exist_ok=True)
  61.  
  62. p1 /= "README.txt"
  63.  
  64. p1.parent.rmdir()
  65.  
  66. p1.parent.exists()
  67.  
  68. # p1.mkdir() #FileNotFoundError
  69.  
  70. p1.mkdir(parents=True)
  71.  
  72. #遍历,并判断文件类型,如果是目录是否可用判断其为空
  73. for x in p1.parents[len(p1.parents)-1].iterdir():
  74. print(x,end='\t')
  75. if x.is_dir():
  76. flag = False
  77. for _ in x.iterdir():
  78. flag = True
  79. break
  80. print("dir", "Not Empty" if flag else "Empyt", sep='\t')
  81. elif x.is_file():
  82. print("file")
  83. else:
  84. 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. p1 = Path("C:\Windows\System32\drivers\etc")
  19.  
  20. print(list(p1.glob("host*"))) #返回当前目录对象下的以host开头的文件
  21.  
  22. print(list(p1.glob("**/*.ddl"))) #递归所有目录,等同于rglob
  23.  
  24. g = p1.rglob('host*') #生成器
  25.  
  26. for _ in g:
  27. print(next(g))
  28.  
  29. #以上代码执行结果如下:
  30. [WindowsPath('C:/Windows/System32/drivers/etc/hosts'), WindowsPath('C:/Windows/System32/drivers/etc/hosts.dz')]
  31. []
  32. 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. print(p1.match("*.py"))
  19.  
  20. print(p1.match("day007\01.pathlib_demo.py"))
  21.  
  22. print(p1.match("D:\**\project\**\**\01.pathlib_demo.py"))
  23.  
  24. print(p1.match("**\01.pathlib_demo.py"))
  25.  
  26. print(p1.match("*\*.py"))
  27.  
  28. #以上代码执行结果如下:
  29. True
  30. True
  31. True
  32. True
  33. 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. Python3.4版本开始,建议使用pathlib模块,提供Path对象来操作,包括目录和文件
  9.  
  10. open(self, mode='r', buffering=-1, encoding=None,errors=None, newline=None)
  11. 使用方法类似内奸函数open,返回一个文件对象。
  12.  
  13. Python3.5增加的新函数
  14. read_bytes()
  15. 以"rb"读取路径对应文件,并返回二进制流,可通过IDE去看源码。
  16. read_text(encoding=None,error=None)
  17. 以"rt"方式读取路径对应文件,返回文本
  18. write_bytes(data)
  19. 以"wb"方式写入数据到路径对应文件
  20. write_text(data,encoding=None,errors=None)
  21. 以"wt"方式写入字符串到路径对应文件。
  22. """
  23. from pathlib import Path
  24.  
  25. p1 = Path("my_binary_file")
  26.  
  27. p1.write_bytes(b"https://www.cnblogs.com/yinzhengjie")
  28.  
  29. print(p1.read_bytes())
  30.  
  31. p2 = Path("my_text_file")
  32.  
  33. p2.write_text("https://www.cnblogs.com/yinzhengjie")
  34.  
  35. print(p2.read_text())
  36.  
  37. with p2.open() as f:
  38. print(f.read(5))
  39.  
  40. #以上代码执行结果如下:
  41. b'https://www.cnblogs.com/yinzhengjie'
  42. https://www.cnblogs.com/yinzhengjie
  43. 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. path = r"C:\Windows\System32\drivers\etc"
  9.  
  10. print(os.name) #windows是nt,Linux是posix。
  11.  
  12. # print(os.uname()) #unix/linux系统支持
  13.  
  14. print(sys.platform) #windows显示win32,Linux显示Linux
  15.  
  16. print(os.listdir(path)) #返回指定目录内容列表,不递归
  17.  
  18. p1 = path + r"\hosts"
  19. print(os.stat(p1))
  20.  
  21. # print(os.chmod(p1,0O77)) #和Linux操作系统的chmod命令类似
  22. # print(os.chown(p1,uid=0,gid=0)) #和Linux操作系统的chown命令类似,可以改变文件的属主,属组,但需要足够的权限
  23.  
  24. """
  25. os模块除了上面列举的还有很多,感兴趣的小伙伴可以在这个模块里找类似需求的方法,满足我们平时的开发基本上问题不大。
  26. 对了,os模块也有open,read,write等方法,但是太底层,建议使用内建函数open,read,write,使用方法相似。
  27. """

Python的路径操作(os模块与pathlib模块)的更多相关文章

  1. python路径操作新标准:pathlib 模块

    之前如果要使用 python 操作文件路径,我总是会条件反射导入 os.path. 而现在,我会更加喜欢用新式的 pathlib, 虽然用得还是没有 os.path 熟练,但是以后会坚持使用. pat ...

  2. Python中路径操作

    目录 1. os.path模块 2. pathlib模块 2.1 目录操作 2.2 文件操作 3. shutil模块 3.1 os模块 3.2 shutil模块 1. os.path模块 3.4版本之 ...

  3. 路径操作OS模块和Path类(全)一篇够用!

    路径操作 路径操作模块 os模块 os属性 os.name # windows是nt, linux是posix os.uname() # *nix支持 sys.platform #sys模块的属性, ...

  4. python之文件系统操作(os模块)

    文件系统操作(os模块) import os file_name = "D:\\test_data\\1.txt" file_name_2 = "D:\\test_dat ...

  5. day18 时间:time:,日历:calendar,可以运算的时间:datatime,系统:sys, 操作系统:os,系统路径操作:os.path,跨文件夹移动文件,递归删除的思路,递归遍历打印目标路径中所有的txt文件,项目开发周期

    复习 ''' 1.跨文件夹导包 - 不用考虑包的情况下直接导入文件夹(包)下的具体模块 2.__name__: py自执行 '__main__' | py被导入执行 '模块名' 3.包:一系列模块的集 ...

  6. Python 搜索文件,文件过滤,pathlib模块

    1,搜索文件,文件过滤 这里使用:pathlib 模块的  Path.glob(pattern)  方法,该方法可以用来过滤目标文件,以迭代器的形式返回搜索结果. pattern: 通配符:" ...

  7. python(3):文件操作/os库

      文件基本操作 r,以读模式打开,  r+=r+w, w, 写模式(清空原来的内容), w+=w+r, a , 追加模式, a+=a+r, rb, wb, ab, b表示以二进制文件打开 想在一段文 ...

  8. Python文件路径操作

    print(os.environ.get('HOME')) # 打印`HOME`这个环境变量 /Users/<> file_path = os.environ.get('HOME') + ...

  9. Python进阶5---StringIO和BytesIO、路径操作、OS模块、shutil模块

    StringIO StringIO操作 BytesIO BytesIO操作 file-like对象 路径操作 路径操作模块 3.4版本之前:os.path模块 3.4版本开始 建议使用pathlib模 ...

随机推荐

  1. Elasticsearch学习之集群常见状况处理(干货)

    1. 集群健康状况处理 当集群处于yellow或者red状态的时候,整体处理步骤如下: (1) 首先查看集群状态 localhost:/_cluster/health?pretty { "c ...

  2. 快速读取TXT几百万行数据, 然后插入到数据,SqlBulkCopy功能的确是有效率

    public static void Main(string[] args) { string strPath = "F:\\Download\\600.txt"; int lin ...

  3. dubbo 报错问题记录:may be version or group mismatch

    凌晨时候钉钉告警群里一直大量报错: 接口异常报警:项目:mp-rest,域名:inside-mp.01zhuanche.com,IP:10.30.3.60,接口地址:/api/v3/driverLog ...

  4. 小程序onShow

    /** * 生命周期函数--监听页面加载 */ onLoad: function(options) { let that = this; const openid = app.globalData.o ...

  5. 嵌入式02 STM32 实验10 定时器中断

    优秀文章 https://blog.csdn.net/qq_38351824/article/details/82619734 一.STM32通用定时器(TIM2.TIM3.TIM4和TIM5共四个通 ...

  6. LeetCode第154场周赛(Java)

    估计要刷很久才能突破三道题了.还是刷的太少.尽管对了前两题,但是我觉得写的不怎么样.还是将所有题目都写一下吧. 5189. "气球" 的最大数量 题目比较简单.就是找出一个字符串中 ...

  7. C语言函数返回指针方法

    1.将函数内部定义的变量用static修饰 由于static修饰的变量,分配在静态内存区(类似于全局变量区),函数返回时,并不会释放内存,因此可以将要返回的变量加static修饰. int *test ...

  8. Go语言【数据结构】字符串

    字符串 简介 一个字符串是一个不可改变的字节序列,字符串通常是用来包含人类可读的文本数据.和数组不同的是,字符串的元素不可修改,是一个只读的字节数组.每个字符串的长度虽然也是固定的,但是字符串的长度并 ...

  9. python_dict json读写文件

    命令汇总: json.dumps(obj) 将python数据转化为json Indent实现缩进,ensure_ascii 是否用ascii解析 json.loads(s) 将json数据转换为py ...

  10. Git diff (---和+++具体解释)(转)

    转自:https://blog.csdn.net/lovezbs/article/details/46492933