1. 主页
  2. Python基础到高级
  3. 目录及文件操作

目录及文件操作

目录操作

在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删除源文件

我们要如何帮助您?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注