Python文件管理

Python文件管理

一、 os模块

1、 方法大纲

2、 常用方法

方法 描述
getcwd() 获取当前工作目录
chdir(path) 将当前的工作目录更改为指定的路径
listdir(path=None) 列出指定目录中的文件名。如果 path 为 None,则使用 path='.'。
mkdir(path, mode=511, *, dir_fd=None) 创建目录
makedirs(name, mode=511, exist_ok=False) 递归创建多层目录
rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None) 重命名文件或目录
remove(path, *, dir_fd=None) 删除文件
rmdir(path, *, dir_fd=None) 删除目录
removedirs(name) 递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空抛出异常。
walk(top, topdown=True, onerror=None, followlinks=False) 遍历 top 路径下的所有子目录,返回一个包含 3 个元素的元组:(dirpath, dirnames, filenames)。
os.curdir 指代当前目录('.')
os.pardir 指代上一级目录('..')
os.sep 路径分割符(Windows 为 '\',Linux 为 '/')
os.linesep 行终止符(Windows 为 '\r\n',Linux 为 '\n')
os.name 指代当前使用的操作系统(Windows 系统为 'nt',Linux 为 'posix')

二、 glob模块

1、 方法大纲

glob模块也是Python标准库中一个重要的模块,主要用来查找符合特定规则的目录和文件,并将搜索的到的结果返回到一个列表中。使用这个模块最主要的原因就是,该模块支持几个特殊的正则通配符,用起来贼方便,这个将会在下方为大家进行详细讲解。

2、 使用示例

import glob

path1 = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_a\[0-9].png"
print(glob.glob(path1))

path2 = r"C:\Users\黄伟\Desktop\publish\os模块\test_shutil_a\[0-9a-z].*"
print(glob.glob(path2))

注意:这个函数里面还有一个参数,recursive,当其为真时,则模式'**'将与任何文件匹配,并且
零或更多目录和子目录。

三、 shutil模块

1、 方法大纲

os模块是Python标准库中一个重要的模块,里面提供了对目录和文件的一般常用操作。而Python另外一个标准库——shutil模块,它作为os模块的补充,提供了复制、移动、删除、压缩、解压等操作,这些 os 模块中一般是没有提供的。但是需要注意的是:shutil模块对压缩包的处理是调用ZipFileTarFile这两个模块来进行的。

2、 压缩包

对压缩包管理是使用zipfile模块

import zipfile
import os

file_list = os.listdir(os.getcwd())  # 获取当前目录
# 将上述所有文件,进行打包,使用“w”
with zipfile.ZipFile(r"我创建的压缩包.zip", "w") as zipobj:  # 对文件进行压缩
    for file in file_list:
        zipobj.write(file)  # 将文件写入压缩包中

四、 pathlib模块

1、 对比图

操作 os and os.path pathlib
绝对路径 os.path.abspath Path.resolve
修改权限 os.chmod Path.chmod
创建目录 os.mkdir Path.mkdir
重命名 os.rename Path.rename
移动 os.replace Path.replace
删除目录 os.rmdir Path.rmdir
删除文件 os.remove, os.unlink Path.unlink
工作目录 os.getcwd Path.cwd
是否存在 os.path.exists Path.exists
用户目录 os.path.expanduser Path.expanduser and Path.home
是否为目录 os.path.isdir Path.is_dir
是否为文件 os.path.isfile Path.is_file
是否为连接 os.path.islink Path.is_symlink
文件属性 os.stat Path.stat, Path.owner, Path.group
是否为绝对路径 os.path.isabs PurePath.is_absolute
路径拼接 os.path.join PurePath.joinpath
文件名 os.path.basename PurePath.name
上级目录 os.path.dirname PurePath.parent
同名文件 os.path.samefile Path.samefile
后缀 os.path.splitext PurePath.suffix

2、 路径获取

  1. 获取当前工作目录

    import pathlib
    
    print(pathlib.Path.cwd())  # 虽然在这里打印出来的很像一个字符串,但实际上得到的是一个WindowsPath对象
    # 其实现了 __repr__ 和 __str__ 底层方法
    print(pathlib.Path(__file__))  # 获取当前文件路径
    

    工作目录是在哪个目录下运行你的程序,不是项目目录

  2. 获取家目录

    import pathlib
    
    print(pathlib.Path.home())  # 获取当前用户的家目录
    
  3. 获取文件绝对路径

    from pathlib import Path
    
    # 当前文件路径
    p = Path(__file__)
    print(p)  
    print(p.absolute())  # 将路径转换为绝对路径,p.resolve()功能也是一样的
    
  4. 遍历当前目录

    from pathlib import Path
    
    # 当前文件路径
    p = Path('files')
    for i in p.iterdir():
        print(i.absolute())
    
    """运行结果:
    C:\Users\3500\PycharmProjects\untitled3\demo\files\json
    C:\Users\3500\PycharmProjects\untitled3\demo\files\username.txt
    C:\Users\3500\PycharmProjects\untitled3\demo\files\yaml
    """
    

3、 文件属性

from pathlib import Path

# 当前文件路径
p = Path(__file__)
print(p.absolute())   # 获取绝对路径
print(p.resolve())    # 获取绝对路径
print(p.name)   # 获取文件名称 'test.py'
print(p.stem)    # 只要文件名,不要后缀 test
print(p.suffix)  # 获取文件 后缀.py
print(p.suffixes)  # 文件所有的后缀 ['.py']
print(p.parts)  # 拆分('C:\\', 'Users', '3500', 'PycharmProjects', 'untitled3', 'demo', 'test.py')
print(p.parent)  # 获取当前路径的父级目录,C:\Users\35000\PycharmProjects\untitled3\demo
print(p.parent.parent)  # C:\Users\3500\PycharmProjects\untitled3
print(p.parents)  # 所有的父级 <WindowsPath.parents>
print(p.anchor)  # 锚,目录前面的部分 C:\ 或者 /

4、 文件判断

from pathlib import Path

# 1.  is_file() 判断是不是文件
print(Path.cwd().is_file())  # False
# 2.  is_dir() 判断是不是文件夹
print(Path.cwd().is_dir())  # True
# exists() 判断文件是否存在
p = Path('./data.json')
print(p.exists())  # True or False
from pathlib import Path

# 当前文件路径
p = Path(__file__)  # 获取当前文件的路径
print(p.is_absolute())  # True

5、 路径拼接

from pathlib import Path

# 当前文件路径
p = Path('./')
print(p.absolute())  # C:\Users\3500\PycharmProjects\untitled3\demo
print(p.joinpath('data.json'))  # data.json
print(p.joinpath('data.json').absolute())   # C:\Users\3500\PycharmProjects\untitled3\demo\data.json
# 拼接多层
print(p.joinpath('files', 'data.json'))   # files\data.json
print(p.joinpath('files', 'data.json').absolute())  # C:\Users\3500\PycharmProjects\untitled3\demo\files\data.json

6、 正则匹配

使用模式匹配(正则表达式)匹配指定的路径。glob 只会匹配当前目录下, rglob 会递归所有子目录
比如在当前脚本的 files 目录有以下文件夹和子文件

from pathlib import Path

p = Path('files')
# glob 只会遍历查找当前目录
print(p.glob('*.txt'))  # <generator object Path.glob at 0x000001A44565A518>
print([i for i in p.glob('*.txt')])  # [WindowsPath('files/username.txt')]
print([i for i in p.glob('*.yml')])  # []
# rglob 只会遍历查找当前目录以及其子目录
print(p.rglob('*.txt'))  # <generator object Path.glob at 0x000001A44565A518>
print([i for i in p.rglob('*.txt')])  # [WindowsPath('files/username.txt')]
print([i for i in p.rglob('*.yml')])  # [WindowsPath('files/yaml/aa.yml'), WindowsPath('files/yaml/bb.yml')]

p_ = Path('data.json')
# math 检查匹配规则
print(p_.match('*.json'))  # True

7、 读写操作

pathlib 对读取和写入进行了简单的封装,不再需要重复去打开文件和管理文件的关闭了。

  • .read_text() 读取文本
  • .read_bytes() 读取 bytes
  • .write_text() 写入文本
  • .write_bytes() 写入 tytes
from pathlib import Path

p = Path('yo.txt')
p.write_text("hello world")
print(p.read_text())  # hello world

file.write 操作使用的是 w 模式,如果之前已经有文件内容,将会被覆盖。

当然,pathlib还可以进行文件的创建,删除,以及修改操作,其与os中的方法一样,可以自行去研究

posted @ 2022-08-20 22:25  Kenny_LZK  阅读(139)  评论(0编辑  收藏  举报