001pyhton文件夹类os|shutil|glob|sys|pathlib基本用法

1.文件路径模块用法

1.1.os|shutil|glob|sys|pathlib

1.1.1.基本语法

import datetime
import os
import shutil
import glob
import re
import sys
import pathlib
from pathlib import Path  # 主要用这个
from filecmp import cmp
# jupyter nbconvert --to markdown 1.ipynb,转化为md

def os_info():
    """操作系统,目录基本信息"""
    print(os.name)  # 打印操作系统的名称,posix,nt,java,对应linux/windows/java虚拟机
    print(os.environ)  # 打印操作系统的环境变量
    print(os.sep)  # 打印操作系统的路径分隔符,不同的系统可能不同,例如Windows上是'\',Unix/Linux上是'/'
    print(os.pathsep)  # 打印操作系统的路径分隔符的字符串,这个值由系统决定
    print(repr(os.linesep))  # 打印操作系统的行分隔符,这个值由系统决定


def os_dir():
    """目录的创建,移除,多级创建,移除"""
    # os.mkdir('cre')  # 创建单层目录,没有就创建目录,有报错
    # os.removedirs('cre')  # 移除空目录,不空就报错
    # os.remove('temp.py')  # 删除某一文件
    # os.makedirs(name='a/w/r', exist_ok=True)  # 创建多层目录,有就提示错误,True忽略错误
    shutil.rmtree('a', ignore_errors=True)  # 删除目录,即使非空,忽略不存在的报错

    def os_dir_create():  # 创建目录通常写法
        if os.path.exists('1'):
            print('纯在')
        else:
            os.mkdir('1')
        os.makedirs('111/2/3/4/5')


def os_path_is():
    """目录,或者文件信息"""
    print(os.getcwd())    # 打印当前工作目录
    file = os.getcwd() + '/tem.py'  # 拼接目录
    print(os.path.split(file))  # 返回目录和文件名元组
    print(os.path.isabs(file))  # 是否是绝对路径
    print(os.path.exists(file))  # 路径是否存在
    print(os.path.getatime(file))  # 获取文件的最后访问时间,时间戳形式
    print(os.path.getctime(file))  # 获取文件的创建时间,时间戳形式
    print(os.path.getmtime(file))  # 获取文件的修改时间,时间戳形式
    print(os.path.getsize(file))  # 获取文件的大小,单位为字节

    # print(
    #     os.system('ipconfig')  # 执行命令,管理进程,运行操作系统命令。这个函数会调用子 shell 来执行命令,返回0成功
    # )

    print(os.getcwd())
    os.chdir('C:/Users/')  # 转换路径
    print(os.getcwd())
    dir_list = os.listdir()  # 获取文件夹下路径目录列表
    print(dir_list)
    for d in dir_list:
        print(d, os.path.isdir(d), os.path.isfile(d))


def os_scsndir():
    """迭代器扫描当下文件"""
    dir_list1 = os.scandir()   # 扫描当前层级所有目录,得到一个迭代器,其中包含目录下的所有文件和子目录
    print(dir_list1)
    for d in dir_list1:
        print(d, d.name, d.is_dir())  # 每一项,名称,是否是目录
        print(d.stat().st_size)  # 文件字节大小,目录为0
        print(d.stat().st_ctime)  # 创建时间戳
        print(datetime.datetime.fromtimestamp(d.stat().st_ctime))  # 格式化时间输出


def os_walk():
    """递归遍历当下所有文件目录"""
    for dirpath, pathnames, filenames in os.walk('./'):  # 从当前目录开始
        print(
            dirpath,  # 当前目录
            pathnames,  # 当前自文件
            filenames,  # 当前子目录
        )


def glob_base():
    """查找匹配文件,目录"""
    os.chdir(r'C:\Users\Public\Documents')
    list1 = glob.glob('001*')  # 使用glob.glob函数查找当前目录下所有以'001'开头的文件或文件夹,返回的是一个列表
    print(list1)

    list3 = glob.glob(  # 设置glob函数为递归模式,查找当前目录及其所有子目录下的所有文件和文件夹
        pathname='**/',
        recursive=True,  # 是否递归搜索
        # dir_fd=3,  # windows不支持
    )
    print(list3)
    # 设置glob函数为递归模式,查找当前目录及其所有子目录下的所有.py文件
    # 如果要对某个路径下进行递归,一定要在后面加两个*,../表示上级目录
    list4 = glob.glob('**/*.py', recursive=True)
    for i in list4:
        if re.search(r'.*00.*\.py', i):  # 用正则表达式匹配
            print('在')
    print(list4)


def shutil_copy():
    """shutil的基本用法"""
    shutil.copy(
        'tem.py', 'a1')  # 复制文件,把tem.py复制从命名到a1,存在的目录直接移动,不存在的目录识别为从命名,文件路径直接从命名
    # 复制文件夹中文件到空文件夹,到非空报错,不存在目录直接创建
    shutil.copypytree('web_spider', '.dea/aaa')
    # 移动文件/文件夹,从命名到新的文件夹,类似,只是原位置没了,目标文件不存在报错
    shutil.move('web_spider', '.dea/aaa')
    shutil.rmtree('a1')  # 递归删除文件夹a1,区别于os.removedirs()


def sys_base():
    """通常用于解释器的交互"""
    args = sys.argv  # 可以通过终端传递参数
    print(args)
    print(args[0])  # 就是文件自己
    print('Hello, world!', file=sys.stdout)  # 将输出打印到标准输出
    print('An error occurred!', file=sys.stderr)  # 将错误消息打印到标准错误

    # sys.path.append('/path/to/directory')  # 将新路径添加到模块搜索路径中,可以添加新的包,模块
    print(
        sys.version,  # 返回 Python 解释器的版本信息
        sys.version_info,  # 一个元组,表示 Python 的版本信息。例如,(3, 8, 5) 表示 Python 3.8.5
        sys.winver,  # 返回 Python 解释器主版号
        sys.platform,  # 返回操作系统平台名称
        sys.path,  # 返回模块的搜索路径列表
        sys.maxsize,  # Python 所能处理的最大整数(以字节为单位)。这取决于系统内存限制
        sys.maxunicode,  # 返回支持的最大 Unicode 值
        sys.copyright,  # 返回 Python 版权信息
        sys.modules,  # 一个字典,包含了所有已加载的模块。可以用来检查某个模块是否已加载
        sys.byteorder,  # 返回本地字节规则的指示器
        sys.executable,  # 返回 Python 解释器所在路径
        sys.builtin_module_names,  # 一个包含所有内置模块名称的字符串列表。这些模块在 Python 启动时自动加载
        sep='\n'
    )

    sys.exit()  # 或者可以使用 sys.exit(1) 传递一个退出状态码


def pathlib_path():
    """pathlib是os.path的升级替代版,实现了路线优化,对象有:PurePath,PurePosixPath,Path,PureWindowsPath,PosixPath,WindowsPath
    继承关系:
    PurePath:[PurePosixPath,Path,PureWindowsPath]
    [PurePosixPath,Path]:PosixPath
    [Path,PureWindowsPath]:WindowsPath"""

    """Path主要是虚拟路径的字符串操作,不一定真实"""
    p = pathlib.Path()  # 创建对象

    # 1.目录的创建和删除
    p1 = Path(r'd:\a\b\c')
    p1.mkdir(exist_ok=True, parents=True)  # 多层路径不存在就报错,递归创建可以解决多层目录,单层可以直接创建
    # p1.rmdir()  # 删除当前空的目录

    print(
        '=' * 100,
        p,  # .返回一个.
        p.resolve(),  # 解析当前路径,不一定真实
        p.home(),  # 返回当前绝对路径,用户users路径
        pathlib.Path.home(),
        p.cwd(),  # f返回当前文件绝对路径
        pathlib.Path.cwd(),
        pathlib.Path('a', 'b', 'c', 'd/e'),  # a\b\c\d\e
        # \a\b\c..d....e\f,//多的忽略,..保留
        pathlib.Path('//a//b///c..d....e/f'),
        'k' / Path.home() / 'dir' / 'file.txt',  # 路径拼接,忽略前面部分
        'k' / Path('a/s/d') / 'm',  # k\a\s\d\m
        Path.home().joinpath('dir', 'file.txt'),  # 路径拼接
        sep='\n'
    )

    # 2.目录的遍历
    p2 = pathlib.Path(r'D:\Users\Pictures')
    print(
        '# ' * 100,
        p2.iterdir(),  # 相当于os.listdir
        p2.glob('*'),  # 相当于os.listdir, 但是可以添加匹配条件
        p2.rglob('*'),  # 相当于os.walk, 也可以添加匹配条件
        p2.glob('*.py'),  # 匹配所有py文件,返回的是一个generator生成器
        list(p2.glob('*.py')),
        p2.rglob('*.py'),  # 递归匹配
        # next(p2.rglob('*.py')),
        Path('C:/Users/1.txt').match('**/*.txt'),  # 正则匹配
        sep='\n',
    )
    for i in p2.rglob('*'):
        print(i)

    # 3.文件的创建和移动,从命名
    f = Path(r'd:\a\b\c\d\e\test.py')  # 目录必须存在,否则报错,通常先判断目录,不存在创建目录
    # f.touch()  # 创建空文件
    if f.exists():  # 判断文件路径是否存在
        print('文件存在!')
    else:
        if Path(r'd:\a\b\c\d\e').exists():  # 文件目录是否存在
            f.touch()
        else:
            Path(r'd:\a\b\c\d\e').mkdir(exist_ok=True, parents=True)  # 创建目录
            f.touch()

    # f.rename(r'd:\a\b\c\d\demo.py')  # 从命名|移动

    # 4.文件操作
    f1 = Path(r'd:\a\b\c\d\demo.py')
    print(
        '=' * 100,
        f1.anchor,  # 锚,目录前面的部分 C:\ 或者 /,根目录
        f1.name,  # 获取文件名demo.py
        f1.stem,  # 获取文件名除后缀的部分demo
        f1.suffix,  # 文件后缀.py
        f1.suffixes,  # 文件的后缀列表['.py']
        f1.parent,  # 相当于dirnanme,上级path对象d:\a\b\c\d
        f1.parents,  # 返回一个iterable, 包含所有父目录<WindowsPath.parents>,[-1]根目录
        f1.parts,  # 将路径通过分隔符分割成一个元组('d:\\', 'a', 'b', 'c', 'd', 'demo.py')
        f1.with_name('x.text'),  # 替换路径最后一部分并返回一个新路径d:\a\b\c\d\x.text
        f1.with_suffix('.jpg'),  # 替换路径扩展名并返回一个新路径d:\a\b\c\d\demo.jpg
        f1.stat(),
        # os.stat_result(st_mode=33206, st_ino=562949953601507, st_dev=2441499967, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1701530719, st_mtime=1701530714, st_ctime=1701530714)
        f1.stat().st_size,  # 大小
        f1.stat().st_ctime,  # 创建时间
        f1.stat().st_mtime,  # 修改时间
        sep='\n',
    )
    for i in f1.parents:  # 索引0是直接的父目录,索引越大越接近根目录,-1跟目录
        print(i)

    print(
        '- ' * 100,
        f1.exists(),  # 是否存在
        f1.is_dir(),  # 是否是目录
        f1.is_file(),  # 是否是普通文件
        f1.is_symlink(),  # 是否是软链接
        f1.is_socket(),  # 是否是socket文件
        f1.is_block_device(),  # 是否是块设备
        f1.is_char_device(),  # 是否是字符设备
        f1.is_absolute(),  # 是否是绝对路径
        sep='\n',
    )

    # 5.文件读写open(mode='r', bufferiong=-1, encoding=None, errors=None, newline=None)
    f2 = Path(r'D:\a\b\c\d\e\1.txt')
    with f2.open(encoding='utf-8') as f:
        print(f.readline())  # 打印第一行

    # f2.write_bytes(b'hello word!')  # 以'wb'方式将数据写入文件
    f2.write_text('Text file contents')  # 以'w'方式写入字符串到路径对应文件
    print(
        '-' * 100,
        # f2.read_bytes(),  # 以'rb'模式读取文件,并返回bytes类型数据
        f2.read_text(),  # 以'r'方式读取路径对应文件,返回文本
        sep='\n',
    )


if __name__ == '__main__':
    sys_base()
    pass

1.1.2.算法


import glob
import os
import shutil
import datetime


def os001():
    """文件,文件夹分类"""
    path = input('Please input a path:')
    os.chdir(path=path)
    l = os.scandir()
    file_list = []
    dir_list = []
    for d in l:
        if d.is_dir():
            dir_list.append(d.name)
        else:
            file_list.append(d.name)
    print(fr'文件夹的数量有{len(dir_list)}个,分别是{dir_list}')
    print('文件的数量有%s,分别是%s' % (len(file_list), file_list))

    f_001 = []
    for i in file_list:
        if 'a' in i.lower():  # 选择包含a,A的文件
            f_001.append(i)
    print('a的文件有{}个,分别是{}'.format(len(f_001), f_001))


def os002():
    """寻找大于30M,并且20天前修改的的zip,"""
    path = input('please input path:')
    os.chdir(path)
    paths = glob.glob('**/*.zip', recursive=True)
    for path in paths:
        file_size = os.stat(path).st_size / 1024 / 1024
        file_modify = datetime.datetime.fromtimestamp(os.stat(path).st_mtime)
        days = (datetime.datetime.now() - file_modify).days
        if (file_size > 30) and (days > 20):
            print(f'压缩包的名称是{path},\t大小是{round(file_size, 2)}MB,\t{days}天前修改')


def os003():
    """从命名某类文件,并且移动到新的地方"""
    path = input('请输入路径:')
    os.chdir(path)

    if not os.path.exists('最新视频1'):
        os.mkdir('最新视频1')

    for dirpath, dirname, filename in os.walk('./'):
        for file in os.scandir(dirpath):  # 当下层级所有目录
            if file.name.endswith('.mp4'):  # 文件名字结尾为.mp4
                tm = datetime.datetime.fromtimestamp(
                    file.stat().st_mtime)  # 获得其最后修改时间
                newname = str(tm.year) + '_' + str(tm.month) + \
                    '_' + str(tm.day) + '_' + file.name  # 构造新名字
                os.rename(dirpath + '/' + file.name, newname)  # 从命名

    file_list = glob.glob('*.mp4')  # 找到所有.mp4文件
    for name in file_list:
        shutil.move(name, '最新视频1')  # 移动文件到指定位置


def os004():
    """文件分类整理"""
    screach_path = r'C:\Users\Public\Downloads'
    os.chdir(screach_path)
    new_path = './分类文件夹'

    if not os.path.exists(new_path):
        os.mkdir(new_path)

    file_num = 0
    dir_num = 0

    for i in glob.glob(f'{screach_path}/**/*', recursive=True):#如果要对某个路径下进行递归,一定要在后面加两个*
        if os.path.isfile(i):
            filename = os.path.basename(i)
            if '.' in filename:
                suffix = filename.split('.')[-1]
            else:
                suffix = 'others'

            if not os.path.exists(f'{new_path}/{suffix}'):
                os.mkdir(f'{new_path}/{suffix}')
                dir_num += 1

            shutil.copy(i, f'{new_path}/{suffix}')
            file_num += 1
    print(f"整理完成,共有{dir_num}类文件,{file_num}个文件")


def pathlib_find_path():
    """通过关键字查找某个文件夹下文件,目录路径"""
    while True:
        folder = input('请输入要查找的文件夹路径:')
        folder = Path(folder.strip())
        if folder.is_dir() and folder.exists():
            break
        else:
            print('亲,输入的路径有误或者不准确,请重新输入')

    search = input('请输入要查找的文件名称:')
    result = list(folder.rglob(f'*{search}*'))

    if not search:
        print(f"在{folder}文件夹下,没有找到含有{search}的文件")
    else:
        result_folder = []
        result_file = []
        for i in result:
            if i.is_dir():
                result_folder.append(i)
            else:
                result_file.append(i)
        if result_folder:
            print(f'查找到包含{search}的文件夹有:')
            for i in result_folder:
                print(i)
        if result_file:
            print(f'查找到包含有{search}的文件有:')
            for i in result_file:
                print(i)

def pathlib_find_duplicate_file():
    """查找当下文件夹中重复的文件,移动多余重复的到新文件夹"""
    scr_folder = Path('./')  # 当前目录下
    dest_folder = Path('./重复文件')

    if not dest_folder.exists():  # 当前目录下存有./重复文件
        dest_folder.mkdir(parents=True)

    list_file = []
    path_list = list(scr_folder.rglob('*'))  # 获得所有列表

    for file in path_list:
        if file.is_file():
            list_file.append(file)  # 获得文件列表

    for m in list_file:
        for n in list_file:
            if m != n and m.exists() and n.exists():  # 不是同一文件,且都存在
                if cmp(m, n):  # 比较文件
                    n.replace(dest_folder / n.name)  # 移动文件
                    # n.unlink()  # 删除文件路径
                
if __name__ == '__main__':
    pathlib_path()
    pass
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值