1, os.path模块 :from os import path
from os import path
from pathlib import Path
p1=Path('D:\download\work')
p = path.join('/a', 'sysconfig', 'abs','network') #拼接
print(path.exists(p1))# 判断路径是否存在
# path.exists(p1)
# p1.exists()
print(path.exists(p))
print(p,type(p))
-------------------------------------------------
True
False
/a\sysconfig\abs\network <class 'str'>
p = path.join('/a', 'sysconfig', 'abs','network')
b = path.split(p) #路径分割,返回的是路径和基名的tuple
a = "abcd"
print(a.split("b")) #字符串分割返回的是列表
print(b,type(b))
----------------------------------------
['a', 'cd']
('/a\\sysconfig\\abs', 'network') <class 'tuple'>
print(path.dirname(p),path.basename(p)) # 路径和基名 返回值是str类型
print(type(path.dirname(p)),type(path.basename(p)))
----------------------------------------
/a\sysconfig\abs network
<class 'str'> <class 'str'>
cd D:\download\work # 切换路径
----------------------------------------
D:\download\work
print(path.splitdrive('D:\download\MobileFile\thumb')) #返回逻辑驱动器和路径
----------------------------------------
('D:', '\\download\\MobileFile\thumb')
p1 = path.abspath('__file__') #绝对路径下的文件
print(p1)
while p1 != path.dirname(p1):
dirname = path.dirname(p1)
print(dirname)
p1 = dirname
----------------------------------------
D:\download\work\__file__
D:\download\work
D:\download
D:\
2, pathlib模块
- 初始化
p = Path() # 当前目录, Path()、Path('.')、Path('')
p = Path('a', 'b', 'c/d') # 当前目录下的a/b/c/d
p = Path('/etc') # 根下的etc目录
- 路径拼接和分解
- 操作符/
- Path对象 / Path对象
- Path对象 / 字符串或者字符串 / Path对象
- 分解parts属性,可以返回路径中的每一个部分joinpath
- joinpath(*other) 连接多个字符串到Path对象中
p = Path()
p = p / "a"
p1 = "b" / p
p2 = Path('c')
p3 = p2 / p1
print(p3, p3.parts)
print(p3.joinpath('etc','int.d',Path('httpd'))) #路径拼接
-----------------------------------------------------
c\b\a ('c', 'b', 'a')
c\b\a\etc\int.d\httpd
- 获取路径
- str 获取路径字符串
- bytes 获取路径字符串的bytes
p = Path('/etc')
print(str(p), bytes(p))
-----------------------------------------------------
\etc b'\\etc'
- 父目录parent
- 目录的逻辑父目录
- parents 父目录序列,可迭代对象,索引0是直接的父
p = Path('/a/b/c/d')
print(p.parent.parent)
for x in p.parents:
print(x)
-----------------------------------------------------
\a\b
\a\b\c
\a\b
\a
\
p = Path("f:/work/002/a/b/c/d/e/f/g/h/i")
p.mkdir(parents=True,exist_ok=True)
p1 = p.parents[1]
p2 = p.parents[2]
p3 = p.parents[3]
print(p1)
print(p2)
print(p3)
-----------------------------------------------------
f:\work\002\a\b\c\d\e\f\g
f:\work\002\a\b\c\d\e\f
f:\work\002\a\b\c\d\e
-
目录组成部分name、stem、suffix、suffixes、with_suffix(suffix)、with_name(name)
- name 目录的最后一个部分
- suffix 目录中最后一个部分的扩展名
- stem 目录最后一个部分,没有后缀
- name = stem + suffix
- suffixes 返回多个扩展名列表
p = Path('/work/mysqlinstall/mysql.tar.gz') print(p.name) print(p.suffix) print(p.suffixes) print(p.stem) ----------------------------------------------------- mysql.tar.gz .gz ['.tar', '.gz'] mysql.tar
- with_name(name) 替换目录最后一个部分并返回一个新的路径
- with_suffix(suffix) 有扩展名则替换,无则补充扩展名
print(p.with_name('mysql-5.tgz')) print(p.with_suffix('.png')) ----------------------------------------------------- \work\mysqlinstall\mysql-5.tgz #替换目录最后一个部分 \work\mysqlinstall\mysql.tar.png #有扩展则替换
p = Path('README') print(p) print(p.with_suffix('.txt')) ----------------------------------------------------- README README.txt # 无扩展名则补充
- 全局方法
- cwd() 返回当前工作目录
- home() 返回当前家目录
cd F:/work/001 ----------------------------------------------------- F:\work\001
p.home() ----------------------------------------------------- WindowsPath('C:/Users/win7')
p.cwd() ----------------------------------------------------- WindowsPath('F:/work/001')
-
判断方法
- exists() 目录或文件是否存在
- is_dir() 是否是目录,目录存在返回True
- is_file() 是否是普通文件,文件存在返回True
px = Path('F:/work/001/') py = Path('F:/work/001/123.ini') pz = Path('c/d/f') px.is_dir(), px.is_file(), py.is_dir(), py.is_file(), pz.exists() ----------------------------------------------------- (True, False, False, True, False)
- is_symlink() 是否是软链接
- is_socket() 是否是socket文件
- is_block_device() 是否是块设备
- is_char_device() 是否是字符设备
- is_absolute() 是否是绝对路径
px.is_symlink(), pz.is_socket(), pz.is_block_device(), px.is_char_device(), px.is_absolute() ----------------------------------------------------- (False, False, False, False, True)
- 绝对路径
- resolve() 非Windows,返回一个新的路径,这个新路径就是当前Path对象的绝对路径,如果是软链接则直接被解析。
- absolute() 获取绝对路径
p.absolute() ----------------------------------------------------- WindowsPath('F:/work/001')
- rmdir() 删除空目录。没有提供判断目录为空的方法
p1 = Path("f:/work/002/a/b/c/d/e/f") # 删除 f 必须是空目录 p1.rmdir()
- touch(mode=0o666, exist_ok=True) 创建一个文件 ,mode 权限
p1 = Path("f:/work/002/a/b/c/d/e/") # 第一步 先设置路径 p1.mkdir(mode=0o777,parents=True,exist_ok=True) #第二步 先创建文件夹 p1 = Path("f:/work/002/a/b/c/d/e/A.txt") # 第三步 在e文件夹下创建文件A.txt p1.touch(mode=0o666, exist_ok=True) p1 = Path("f:/work/002/a/b/c/d/e/x.exe") # 创建的x.exe是文件夹
- as_uri() 将路径返回成URI,例如’file:///etc/passwd’
- mkdir(mode=0o777, parents=False, exist_ok=False)
- parents,是否创建父目录,True等同于mkdir -p。False时,父目录不存在,则抛出FileNotFoundError ,exist_ok参数,在3.5版本加入。False时,路径存在,抛出FileExistsError;True时,FileExistsError被忽略
p1 = Path("f:/work/002/a/b/c/d/e") p1.mkdir(mode=0o666, parents=True, exist_ok=True) ----------------------------------------------------- ## F:\work\002\a\b\c\d\e,电脑中按顺序新建文件夹
- iterdir() 迭代当前目录(用for循环查看当前目录,查看当前目录所有的文件和文件),不递归,
判断目录文件夹下的文件是空目录还是文件from pathlib import Path from os import path p = Path("F:/work/002/a/b/c/d/e/f/g/h") p.mkdir(mode =0o777,parents=True,exist_ok=True) p.touch() p1 = p.parents[6] for x in p1.iterdir(): # 等价于glob.glob(F:/work/002/a/*) # print(path.basename(x)) print(x.name) ----------------------------------------------------- abc - 副本.txt abc.txt b #文件夹
p = Path("F:/work/002/a/b/c/d/e/f/g/h") for x in p.iterdir(): if x.is_dir(): for y in x.iterdir(): print("dir:",x.name,"is not empty") break else: x.is_file() print("file:",x.name) ----------------------------------------------------- dir: i is not empty # h文件夹下的i文件夹,不为空 file: Pointofix.exe # h文件夹下的文件 Pointofix.exe
-
通配符
- glob(pattern) 通配给定的模式
import glob glob.glob('F:/work/002/a/*',recursive=True) -------------------------------------------- ['F:/work/002/a\\abc - 副本.txt', 'F:/work/002/a\\abc.txt', 'F:/work/002/a\\b'] import glob glob.glob('*',recursive=True) #此方法也可以查看当前目录下的所有的文件和文件夹,返回列表 -------------------------------------------- ['abc - 副本.txt', 'abc.txt', 'b']
- rglob(pattern) 通配给定的模式,递归目录都返回一个生成器
- ? 代表一个字
g = p.rglob('*.???') #匹配扩展名为3个字符的文件 返回的是生成器
- 符* 表示任意个字符
list(p.glob('*.txt')) #遍历当前目录下所有的以.txt为后缀的文件 list(p.glob("**/*.txt") #遍历当前目录下所有的子目录内的以.txt为后缀的文件 list(p.glob("**/*")) #遍历当前目录下所有的子目录和文件
- [abc]或[a-z] 表示一个字符
list(p.rglob('[a-z]*.???')) # 匹配字母开头的且扩展名是3个字符的文件
-
匹配
- match(pattern) 模式匹配,成功返回True
Path('a/b.py').match('*.py') # True Path('/a/b/c.py').match('b/*.py') # True Path('/a/b/c.py').match('a/*.py') # False Path('/a/b/c.py').match('a/*/*.py') # True Path('/a/b/c.py').match('a/**/*.py') # True Path('/a/b/c.py').match('**/*.py') # True
- stat() 相当于stat命令lstat()
- 同stat(),但如果是符号链接,则显示符号链接本身的文件信息
- 文件操作
- 使用方法,类似内建函数open。返回一个文件对象
Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
- 3.5增加的新函数,
- Path.read_bytes() 以’rb’读取路径对应的文件,并返回二进制流。
- Path.read_text(encoding=None,errors=None) 以’rt’方式读取路径对应文件,返回文本。
- Path.write_bytes(data) 以’wb’方式写入数据到路径对应文件。
- Path.write_text(data, encoding=None,errors=None) 以’wt’方式写入字符串到路径对应文件
os模块
- os.listdir(‘o:/temp’)
- 返回指定目录内容列表,不递归。
p = Path('f:/work/001/a/b/c/d/')
os.listdir('f:/work/001/a')
--------------------------------------------
['asoy.txt', 'b'] #文件夹a下有文件saoy.txt和文件夹b,返回的是列表
-
os也有open、read、write等方法,但是太底层,建议使用内建函数open、read、write,使用方式相似。
-
os.stat(path, *, dir_fd=None, follow_symlinks=True)
-
本质上调用Linux系统的stat。
-
path:路径的string或者bytes,或者fd文件描述符
-
follow_symlinks True返回文件本身信息,False且如果是软链接则显示软链接本身。对于软链接本身,可以使用os.lstat方法
-
os.chmod(path, mode, *, dir_fd=None, follow_symlinks=True) os.chmod(‘test’,0o777)
-
os.chown(path, uid, gid)
-
改变文件的属主、属组,但需要足够的权限