目录操作
在Python3.4之前的路径操作方式,是使用os.path以字符串的方式操作路径的
在Python3.4中新增加了一个pathlib模块来操作路径,是以OO(对象)的方式操作的
In [18]: import pathlib
In [19]: cwd = pathlib.Path('.') # 当前目录的对象
In [20]: cwd.is_dir() # 是否是一个目录
Out[20]: True
In [21]: for i in cwd.iterdir(): # 遍历一个目录
...: print(i)
...:
.java
.cshrc
创建文件夹
使用pathlib创建文件夹比较复杂
In [22]: create_dir = pathlib.Path('./tests') # 生成一个需要创建的文件夹的对象
In [24]: create_dir.exists() # 确认目录是否存在
Out[24]: False
In [25]: create_dir.mkdir(0o755, parents=True, exist_ok=True) # 创建一个tests文件夹,设置文件夹权限为755
相当于mkdir -p, 参数parents=True的时候是自动创建父目录,exist_ok=True的时候则是若目录存在着不抛出任何错误
In [26]: ls -ld tests # 查看文件已经存在
drwxr-xr-x 2 root root 4096 Jul 1 19:12 tests/
删除文件
In [27]: delete_dir = pathlib.Path('./tests') # 生成需要删除的目录对象
In [28]: delete_dir.rmdir() # 删除文件,另外rmdir删除文件夹的话,只能删除目录为空的文件夹
In [29]: ls -ld tests # 确认目录已经删除
ls: cannot access tests: No such file or directory
文件对象的通用操作
当文件或者目录不存在的时候,所有以布尔为返回值的方法,都是False
In [31]: f = pathlib.Path('./lanyulei.txt')
In [33]: f.is_file() # 判断是不是一个文件
Out[33]: False
In [34]: f.is_dir() # 判断是不是一个目录
Out[34]: False
In [36]: f.exists() # 判断文件或者目录是否存在
Out[36]: False
In [37]: f.is_absolute() # 判断是否为绝对路径
Out[37]: False
In [40]: f.touch(mode=0o666, exist_ok=True) # 创建文件,如果文件已存在且 exist_ok=False,则抛 FileExistsError,设置为 True 则忽略(文件修改时间更新到当前时间)。
Out[40]: False
In [40]: f.write_text(content) # 按文本写入内容
In [41]: f.write_bytes(b'content') # 按字节写入内容
In [42]: f.read_bytes() # 按字节读取内容
In [43]: f.read_text() # 按文本写入内容
In [43]: f.unlink() # 只用于删除文件和符号链接,若路径指向目录,请改用调用 rmdir() 或 shutil.rmtree()。
常用的一些方法操作
In [38]: f.absolute() # 获取文件或者目录的绝对路径
Out[38]: PosixPath('/root/lanyulei.txt')
In [39]: f.absolute().as_uri() # 获取文件的资源链接
Out[39]: 'file:///root/lanyulei.txt'
In [40]: f.cwd() # 获取当前目录
Out[40]: PosixPath('/root')
In [56]: f.chmod(0o755) # 给当前目录或者文件设置权限
In [57]: f.drive # windows下特有的,会返回在那个磁盘中,Linux会返回一个空的字符串
Out[57]: ''
In [59]: f.home() # 返回家目录
Out[59]: PosixPath('/root')
In [60]: f.lchmod(0o755) # 对符号链接本身权限的修改
In [61]: f.name # 获取路径的basename最后一段名字
Out[61]: 'lanyulei.txt'
In [5]: f.home().parent # 获取文件或者目录的父目录
Out[5]: PosixPath('/')
In [6]: f.owner() # 文件的属主是谁
Out[6]: 'root'
In [5]: f.suffix # 获取文件的后缀
Out[5]: '.txt'
In [6]: f.suffixes # 列表的方式存储文件的后缀
Out[6]: ['.txt']
In [7]: f.stat() # 文件的详细信息
Out[7]: os.stat_result(st_mode=33261, st_ino=1557902, st_dev=64769, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1498917527, st_mtime=1498917527, st_ctime=1498917552)
In [3]: f.lstat() # 处理软链文件的
Out[3]: os.stat_result(st_mode=33261, st_ino=1557902, st_dev=64769, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1498917527, st_mtime=1498917527, st_ctime=1498917552)
In [8]: d = pathlib.Path('.')
In [9]: for i in d.glob('**/*.py'): # glob这个强大了,这个是获取当前目录及子目录下的所有后缀为py的文件
...: print(i)
...:
demo1.py
In [12]: for i in d.rglob('*.py'): # rglob是自动迭代,获取后缀为py的文件
...: print(i)
...:
demo1.py
路径操作
自动拼接路径
In [13]: pathlib.Path('/','root','scripts') # Linux下自动拼接路径
Out[13]: PosixPath('/root/scripts')
In [21]: print(pathlib.PureWindowsPath('c:','windows','system32')) # windows下的自动拼接路径
c:windows\system32
复制,移动,删除
使用shutil模块来操作复杂的文件或者目录操作
针对文件的操作
- shutil.copyfileobj # 操作的对象是文件对象
- shutil.copyfile # 仅复制内容
- shutil.copymode # 仅复制权限
- shutil.copystat # 仅复制元数据
- shutil.copy # 复制文件内容和权限 copyfile + copymode
- shutil.copy2 # 复制文件内容和元数据 copyfile + copystat
针对目录的操作
shutil.copytree # 递归的复制目录,copy_function 参数指定用何种方法复制文件
shutil.retree # 用于递归删除目录,ignore_errors 表示是否忽略错误,onerror参数表示如何处理错误,仅当ignore_errors为False时,onerror才生效,ignore_errors为True是遇到错误直接抛出异常,慎重使用
shutil.move # 具体实现依赖操作系统,如果操作系统实现了rename系统调用,直接走rename系统调用,如何没实现,先使用copytree复制,然后使用retree删除源文件