• 附实战代码|告别OS模块,体验Python文件操作新姿势!


    相比常用的 os.path而言,pathlib 对于目录路径的操作更简介也更贴近 Pythonic。但是它不单纯是为了简化操作,还有更大的用途。

    pathlib 是Python内置库,Python 文档给它的定义是:The pathlib module – object-oriented filesystem paths(面向对象的文件系统路径)

    pathlib 提供表示文件系统路径的类,其语义适用于不同的操作系统。

    更多详细的内容可以参考官方文档:

    https://docs.python.org/3/library/pathlib.html#methods


    很多人学习python,不知道从何学起。
    很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
    很多已经做案例的人,却不知道如何去学习更加高深的知识。
    那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
    QQ群:1156465813

      一、Path 类的基本使用

    下面是获取文件名、获取文件名除后缀的部分、获取文件后缀、返回一个iterable 包含所有父目录等常用操作示例

    from pathlib import Path
    
    path = r'D:pythonpycharm2020programpathlib模块的基本使用.py'
    p = Path(path)
    print(p.name)       # 获取文件名
    print(p.stem)       # 获取文件名除后缀的部分
    print(p.suffix)     # 获取文件后缀
    print(p.parent)     # 相当于dirname
    print(p.parent.parent.parent)
    print(p.parents)    # 返回一个iterable 包含所有父目录
    for i in p.parents:
        print(i)
    print(p.parts)      # 将路径通过分隔符分割成一个元组
    

      

    运行结果如下:

    pathlib模块的基本使用.py
    pathlib模块的基本使用
    .py
    D:pythonpycharm2020program
    D:python
    <WindowsPath.parents>
    D:pythonpycharm2020program
    D:pythonpycharm2020
    D:python
    D:
    ('D:\', 'python', 'pycharm2020', 'program', 'pathlib模块的基本使用.py')
    • Path.cwd()返回表示当前目录的路径对象
    • Path.home()返回表示用户主目录的路径对象
    • Path.expanduser()返回带有扩展的 ~user 构造的新路径
    from pathlib import Path
    
    path_1 = Path.cwd()       # 获取当前文件路径
    path_2 = Path.home()
    p1 = Path('~/pathlib模块的基本使用.py')
    print(path_1)
    print(path_2)
    print(p1.expanduser())
    

    运行结果如下:

    D:pythonpycharm2020program
    C:UsersAdministrator
    C:UsersAdministratorpathlib模块的基本使用.py

    Path.stat()返回一个操作系统统计结果包含有关此路径的信息的对象

    from pathlib import Path
    import datetime
    
    p = Path('pathlib模块的基本使用.py')
    print(p.stat())            # 获取文件详细信息
    print(p.stat().st_size)    # 文件的字节大小
    print(p.stat().st_ctime)   # 文件创建时间
    print(p.stat().st_mtime)   # 上次修改文件的时间
    creat_time = datetime.datetime.fromtimestamp(p.stat().st_ctime)
    st_mtime = datetime.datetime.fromtimestamp(p.stat().st_mtime)
    print(f'该文件创建时间:{creat_time}')
    print(f'上次修改该文件的时间:{st_mtime}')
    

    运行结果如下:

    os.stat_result(st_mode=33206, st_ino=3659174698076635, st_dev=3730828260, st_nlink=1, st_uid=0, st_gid=0, st_size=543, st_atime=1597366826, st_mtime=1597366826, st_ctime=1597320585)
    543
    1597320585.7657475
    1597366826.9711637
    该文件创建时间:2020-08-13 20:09:45.765748
    上次修改该文件的时间:2020-08-14 09:00:26.971164

    从不同.stat().st_属性 返回的时间戳表示自1970年1月1日以来的秒数,可以用datetime.fromtimestamp将时间戳转换为有用的时间格式。

    • Path.exists()路径是否存在于现有文件或目录
    • Path.resolve(strict=False)将路径设为绝对路径,解析任何符号链接。返回一个新的路径对象
    from pathlib import Path
    
    p1 = Path('pathlib模块的基本使用.py')          # 文件
    p2 = Path(r'D:pythonpycharm2020program')   # 文件夹 
    absolute_path = p1.resolve()
    print(absolute_path)
    print(Path('.').exists())
    print(p1.exists(), p2.exists())
    print(p1.is_file(), p2.is_file())
    print(p1.is_dir(), p2.is_dir())
    print(Path('/python').exists())
    print(Path('non_existent_file').exists())
    

    运行结果如下:

    D:pythonpycharm2020programpathlib模块的基本使用.py
    True
    True True
    True False
    False True
    True
    False

    • Path.iterdir()当路径指向某个目录时,将生成该目录内容的path对象
    from pathlib import Path
    
    p = Path('/python')
    # python目录下存在的文件
    for child in p.iterdir():
        print(child)

    运行结果如下:

    pythonAnaconda
    pythonEVCapture
    pythonEvernote_6.21.3.2048.exe
    pythonNotepad++
    pythonpycharm-community-2020.1.3.exe
    pythonpycharm2020
    pythonpyecharts-assets-master
    pythonpyecharts-gallery-master
    pythonSublime text 3

    • Path.glob(pattern)Glob此路径表示的目录中给定的相对模式,生成所有匹配的文件(任何类型),**模式表示递归地此目录和所有子目录。换句话说,它支持递归全局化。
    • Note 在大型目录树中使用 **模式可能会耗费大量时间

    递归遍历该目录下所有文件,获取所有符合pattern的文件,返回一个generator。

    下面是一些常用操作的代码,拿走就用

    获取该文件目录下所有.py文件

    from pathlib import Path
    
    path = r'D:pythonpycharm2020program'
    p = Path(path)
    file_name = p.glob('**/*.py')
    print(type(file_name))   # <class 'generator'>
    for i in file_name:
        print(i)
    

    获取该文件目录下所有.jpg图片

    from pathlib import Path
    
    path = r'D:pythonpycharm2020program'
    p = Path(path)
    file_name = p.glob('**/*.jpg')
    print(type(file_name))   # <class 'generator'>
    for i in file_name:
        print(i)

    获取给定目录下所有.txt文件、.jpg图片和.py文件

    from pathlib import Path
    
    def get_files(patterns, path):
        all_files = []
        p = Path(path)
        for item in patterns:
            file_name = p.rglob(f'**/*{item}')
            all_files.extend(file_name)
        return all_files
    
    path = input('>>>请输入文件路径:')
    results = get_files(['.txt', '.jpg', '.py'], path)
    print(results)
    for file in results:
        print(file)
    

    关于Path.mkdir(mode=0o777, parents=False, exist_ok=False) 的说明

    • 在给定的路径上创建一个新目录。如果指定了mode,它将与进程的umask值结合起来,以确定文件模式和访问标志。如果路径已存在,则引发FileExistsError。
    • 如果parents参数设置为True,则将根据需要创建此路径的任何缺少的父级;它们是使用默认权限创建的,而不考虑模式(模仿POSIX mkdir-p命令)。
    • 如果父项为False(默认值),则缺少父项将引发FileNotFoundError。
    • 如果exist_ok为False(默认值),则在目标目录已存在的情况下引发FileExistsError。
    • 如果exist_ok为True,则将忽略 FileExistsError 异常(与POSIX mkdir-p命令的行为相同),但仅当最后一个路径组件不是现有的非目录文件时。

    在版本3.5中更改:添加了exist_ok参数。

    Path.rmdir():删除此目录,目录必须为空。

    from pathlib import Path
    
    p = Path(r'D:pythonpycharm2020program	est')
    p.mkdir()
    p.rmdir()
    
    from pathlib import Path
    
    p = Path(r'D:python	est1	est2	est3')
    p.mkdir(parents=True)  # If parents is true, any missing parents of this path are created as needed
    p.rmdir()    # 删除的是test3文件夹
    
    from pathlib import Path
    
    p = Path(r'D:python	est1	est2	est3')
    p.mkdir(exist_ok=True)
    • Path.unlink()(missing_ok=False):删除此文件或符号链接。如果路径指向目录,请使用Path.rmdir()代替。如果missing_ok为False(默认值),则在路径不存在的情况下引发FileNotFoundError。如果missing_ok为true,则将忽略FileNotFoundError异常。在版本3.8中更改:添加了缺少的“确定”参数。
    • Path.rename()(target):将此文件或目录重命名为给定目标,并返回指向目标的新路径实例。在Unix上,如果目标存在并且是一个文件,如果用户有权限,它将被无提示地替换。目标可以是字符串或其他路径对象。
    • Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None):打开路径指向的文件,就像内置的 open() 函数一样。
    from pathlib import Path
    
    p = Path('foo.txt')
    p.open(mode='w').write('some text')
    target = Path('new_foo.txt')
    p.rename(target)
    content = target.open(mode='r').read()
    print(content)
    target.unlink()
    

      二、与os模块用法的对比

      三、实战案例

    对于多层文件夹的读取,用os模块只能一层一层读取出文件,要写多个for循环,效率不高,这时我们可以用 Path.glob(**/*) 大法,下面以一个实际案例来体验它的强大。

    用于测试的文件夹如下:

    md文件中数据如下:

    需要实现将该目录下所有 md 文件的数据提取出来,并进行清洗,然后写入 csv 文件中

    # -*- coding: UTF-8 -*-
    from pathlib import Path
    import re
    import pandas as pd
    
    
    # 传入路径
    p = Path(r'.微博热搜数据热搜数据/')
    # 得到该文件目录下所有 .md文件
    file_list = list(p.glob('**/*.md'))
    print(f'读取md文件数量:{len(file_list)}')
    for item in file_list:
     print(item)
    
    # 每天有两条热搜汇总  11点  23点  会有重合数据  去重
    filelist = list(filter(lambda x: str(x).find('23点') >= 0, file_list))
    sum_list = []
    
    i = 0
    for file in filelist:
     # 遍历出每一个md文件   读取数据
     with file.open(encoding='utf-8') as f:
      lines = f.readlines()
     lines = [i.strip() for i in lines]   # 去除空字符
     data = list(filter(None, lines))     # 去除掉列表中的空子串
     data = data[1:101]
     con = data[::2]     # 热搜内容
     rank = data[1::2]   # 热度
     date = re.findall('年(.+)2', str(file)) * len(con)
     for m in range(len(con)):
      con[m] = con[m].split('、')[-1]   # 字符串操作
     for n in range(len(rank)):
      rank[n] = re.findall(r'd+', rank[n])[0]
     con_dic = {'日期': date, '热搜内容': con, '热度': rank}
     df = pd.DataFrame(con_dic)
     if i == 0:
      df.to_csv('weibo1.csv', mode='a+', index=False, header=True)
     else:
      df.to_csv('weibo1.csv', mode='a+', index=False, header=False)
     # 每个md文件中有50条数据
     i += 50
    
    print('共{}条数据写入csv'.format(i))
    

    运行效果如下:

    可以看到成功将该目录下所有 md 文件的数据提取出来,并进行清洗,然后写入了 csv 文件中。


    注意:如果你是打算找python高薪工作的话。我建议你多写点真实的企业项目积累经验。不然工作都找不到,当然很多人没进过企业,怎么会存在项目经验呢? 所以你得多找找企业项目实战多练习下撒。如果你很懒不想找,也可以进我的Python交流圈:1156465813。群文件里面有我之前在做开发写过的一些真实企业项目案例。你可以拿去学习,不懂都可以在裙里找我,有空会耐心给你解答下。


    以下内容无用,为本篇博客被搜索引擎抓取使用
    (* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
    python 是干什么的 零基础学 python 要多久 python 为什么叫爬虫
    python 爬虫菜鸟教程 python 爬虫万能代码 python 爬虫怎么挣钱
    python 基础教程 网络爬虫 python python 爬虫经典例子
    python 爬虫
    (* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
    以上内容无用,为本篇博客被搜索引擎抓取使用

  • 相关阅读:
    leetcode203
    leetcode88
    leetcode219
    leetcode225
    2018-12-25-C#-使用转换语义版本号
    2018-12-25-C#-使用转换语义版本号
    2018-10-15-Winforms-可能遇到的-1000-个问题
    2018-10-15-Winforms-可能遇到的-1000-个问题
    2018-8-10-UWP-WPF-解决-xaml-设计显示异常
    2018-8-10-UWP-WPF-解决-xaml-设计显示异常
  • 原文地址:https://www.cnblogs.com/shuchongzeishuai/p/13968271.html
Copyright © 2020-2023  润新知