024.Python基础进阶_文件其他操作

无奋斗不青春

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈

分隔线

文件其他操作

  • 文件的其他相关操作都是基于 os 模块的,所以在开始的时候需要导入模块 import os
  • 本文中用到了osos.pathshutil模块

重命名操作

  • 方法
    os.rename(oldname, newname)         # 修改单级 目录/文件 名称
    
    os.renames(oldname, newname)        # 修改多级 目录/文件名称
    # 同时修改目录名和文件名,目录下有多个文件时
    # 如果重命名全部文件,那么会对目录和文件直接重命名
    # 如果重命名部分文件,那么会新建一个目录,然后将文件重命名并移动到新文件夹
    
  • 示例
    import os
    
    # 重命名文件名称
    # os.rename('a.txt', 'aa.txt')
    # os.renames('aa.txt', 'a.txt')
    
    # 重命名文件夹名称
    # os.rename('one', 'two')
    # os.renames('two', 'one')
    
    # 重命名文件夹及文件夹内部文件名称
    # 将one文件夹重命名为two,内部one.txt重命名为two.txt
    # os.rename('one/one.txt', 'two/two.txt')
    # 报错:FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'one/one.txt' -> 'two/two.txt'
    
    os.renames('one/one.txt', 'two/two.txt')
    # 同时修改目录名和文件名,目录下有多个文件时
    # 如果重命名全部文件,那么会对目录和文件直接重命名
    # 如果重命名部分文件,那么会新建一个目录,然后将文件重命名并移动到新文件夹
        
    

删除操作

删除文件
  • 方法
    os.remove(path)     # 删除指定文件,文件不存在会报错
    
  • 示例
    import os
    
    os.remove('xxx.jpg')    # 删除文件xxx.jpg
    
删除目录
  • 方法
    os.rmdir(path)              # 删除指定目录,如果目录非空,则会报错
    
    os.removedirs(path)         # 递归删除目录,删除整个路径所有目录,如果目录非空,则会报错
    
    
  • 示例
    import os
    
    # 删除文件
    os.remove('xxx.jpg')
    # 如果文件不存在,则报错:FileNotFoundError: [WinError 2] 系统找不到指定的文件。: 'xxx.jpg'
    
    # 删除目录
    # os.rmdir('one')
    # os.rmdir('two')                   # OSError: [WinError 145] 目录不是空的。: 'two'
    # os.rmdir('three')                 # OSError: [WinError 145] 目录不是空的。: 'three'
    
    # os.removedirs('one')
    # os.removedirs('two')              # OSError: [WinError 145] 目录不是空的。: 'two'
    # os.removedirs('three')            # OSError: [WinError 145] 目录不是空的。: 'three'
    
    # os.rmdir('three/three2')          # 仅仅只是删除three目录下的three2目录
    # os.removedirs('three/three3')     # 删除three3目录后递归删除three目录
    
    os.removedirs('three/three3')       # 如果three目录下有three2和three3目录,则只会删除three3目录,不会报错
    

创建文件夹

  • 方法
    os.mkdir(path[, mode])              # 创建一级目录,并不能递归创建多级目录
    # 创建已经存在的目录,会报错
    
    # mode:以八进制数设置目录权限,默认0o777
    
    
    # 了解:数字模式权限
        # 文件拥有者
            # 读(r):4
            # 写(w):2
            # 可执行(x):1
        
        # 同组用户
            # 读(r):4
            # 写(w):2
            # 可执行(x):1
        
        # 其他用户
            # 读(r):4
            # 写(w):2
            # 可执行(x):1
            
    # 例如:os.mkdir('one', 0o777)
    # 0o777
    # 0o -> 7:             # 文件拥有者,读、写、可执行权限 ( 4 + 2 + 1 )
    # 0o -> 7 -> 7:        # 同组用户,读、写、可执行权限 ( 4 + 2 + 1 )
    # 0o -> 7 -> 7 -> 7:   # 其他用户,读、写、可执行权限 ( 4 + 2 + 1 )
    
  • 示例
    import os
    
    os.mkdir('a')           # 创建一个目录a
    
    os.mkdir('b/c/d')       # 报错,不能递归创建多级目录
    # FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'b/c/d'
    
    

获取当前目录

  • 方法
    os.getcwd()             # 获取当前目录,返回目录全路径
    
  • 示例
    import os
    
    path = os.getcwd()
    print(path)             # 输出当前目录路径:E:\Projecs\Python\12-文件操作
    

切换当前目录(改变默认目录)

  • 方法
    os.chdir(newpath)       # 切换目录到指定路径(修改当前目录为指定路径)
    
  • 示例
    import os
    
    print(os.getcwd())      # 获取当前默认目录路径
    
    os.chdir('../11-函数')  # 切换默认目录到指定路径
    
    print(os.getcwd())      # 获取当前默认目录路径
    
    # -----输出结果-----
    E:\Projecs\Python\12-文件操作
    E:\Projecs\Python\11-函数
    

获取目录内容列表

  • 方法
    os.listdir(path)        # 获取指定目录下所有文件名,返回一个列表。默认当前目录
    # 只能获取指定目录内文件列表,不能递归获内层目录内文件列表
    
  • 示例
    import os
    
    print(os.listdir())             # 默认获取当前目录内所有文件列表
    print(os.listdir('./'))         # 获取当前目录内所有文件列表
    print(os.listdir('../'))        # 获取当前目录上一级目录内所有文件列表
    

关于路径的补充

  • 路径的补充
    ./ :表示当前所在目录
    ../ :表示当前目录的上一级目录
    

案例1:复制文件

  • 要求:将一个文件复制到另一个副本中
  • 步骤分析:
    1、 打开文件
        1.1、 以可读模式打开要复制的文件(只读模式即可)
        1.2、 以可写模式打开一个新文件作为副本文件(写模式会自动创建新文件)
    2、 读写文件
        2.1、 读取源文件内容
        2.2、 将读取到的内容写入到副本文件中
    3、 关闭文件
        3.1、 关闭源文件
        3.2、 关闭副本文件
    
  • 代码实现
    # 1、 打开文件
    # 1.1、 以可读模式打开要复制的文件(只读模式即可)
    source_file = open('../11-函数/02-函数参数.py', mode='r',encoding='utf-8')
    # 1.2、 以可写模式打开一个新文件作为副本文件(写模式会自动创建新文件)
    target_file = open('02-函数参数_副本.py', mode='w', encoding='utf-8')
    
    # 2、 读写文件
    # 2.1、 读取源文件内容
    source_content = source_file.read()
    # 2.2、 将读取到的内容写入到副本文件中
    target_file.write(source_content)
    
    # 3、 关闭文件
    # 3.1、 关闭源文件
    source_file.close()
    # 3.2、 关闭副本文件
    target_file.close()
    
  • 大文件读写注意事项
    • 文件在读取的时候是将内容全部读取到内存中
    • 文件太大,一次性全部读取,则会导致内存占用太多
    • 应该通过循环分批读取,副本文件需要用追加模式,不断追加内容
    • 不用行读取,是因为有些文件本身就没有分行,这样也就会出现一次性读取全部的问题
  • 代码优化
    # 优化:
        # 1. 副本文件以追加模式打开
        # 2. 通过循环读写文件,每次读写指定长度内容
    
    # 1、 打开文件
    # 1.1、 以可读模式打开要复制的文件(只读模式即可)
    source_file = open('../11-函数/02-函数参数.py', mode='r', encoding='utf-8')
    # 1.2、 以追加模式打开一个新文件作为副本文件
    target_file = open('02-函数参数_副本.py', mode='a', encoding='utf-8')
    
    # # 2、 读写文件
    # # 2.1、 读取源文件内容
    # source_content = source_file.read()
    # # 2.2、 将读取到的内容写入到副本文件中
    # target_file.write(source_content)
    
    # 优化读写过程
    while True:
        # 指定按1024字符读取内容
        source_content = source_file.read(1024)
        # 判断读取到的内容是否为空,为空表示读取完了,结束循环
        if len(source_content) == 0:
            break
        # 将读取到的内容写入到副本文件中
        target_file.write(source_content)
    
    # 3、 关闭文件
    # 3.1、 关闭源文件
    source_file.close()
    # 3.2、 关闭副本文件
    target_file.close()
    

案例2:文件分类操作

  • 要求:给定一批文件(多种类型.jpg、.txt、.avi、.xlsx),根据文件类型进行分类,并生成文件清单
    # 1、按照文件后缀名将文件划分到不同的文件
        # jpg目录:a.jpg、b.jpg、...
        # avi目录:e.avi、1.avi、...
        # txt目录:8.txt、j.txt、...
        # xlsx目录:d.xlsx、4.xlsx、...
        
    # 2、生成.txt格式文件清单
        # file/avi
            # 8.avi
            # i.avi
        # file/jpg
            # 7.jpg
            # 33.jpg
            # gi.jpg
        # file/txt
            # 1.txt
            # a.txt
        # file/xlsx
            # 5.xlsx
            # e.xlsx
    
  • 步骤分析
    # 1、获取所有文件名称列表
    # 2、遍历所有文件名称
    # 3、分解文件的后缀名
    # 4、判断后缀名目录是否存在
        # 4.1 目录不存在,创建一个目录并将文件移动到该目录
        # 4.2 目录存在,将文件移动到目录中
    
  • 代码实现
    import os
    import shutil
    # 由于后续操作都在file目录内,所以切换默认目录
    os.chdir('file')
    
    # 1、获取所有文件名称列表
    file_name = os.listdir('./')
    # 2、遍历所有文件名称
    for file in file_name:
        # 3、分解文件的后缀名
        ext_name = file.split('.')[-1]
        # 4、判断后缀名目录是否存在
        if not os.path.exists(ext_name):
            # 4.1 目录不存在,创建一个目录
            os.mkdir(ext_name)
    
        # 5、 将文件移动到目录中
        shutil.move(file, ext_name)
    
    
  • 这段代码虽然实现了我们的需求,但是里面用了两个我们暂时没有学到的知识点os.path.exists(ext_name)shutil.move(file, ext_name)
  • 接下来就用我们已经学过的知识再来写一个
    import os
    
    # 由于后续操作都在file目录内,所以切换默认目录
    os.chdir('file')
    
    # 1、获取所有文件名称列表
    file_name = os.listdir('./')
    
    # 2、遍历所有文件名称
    for file in file_name:
        # 3、分解文件的后缀名
        ext_name = file.split('.')[-1]
    
        # 5、 将文件移动到目录中,利用修改多级 目录/文件名称的特性
        # 如果重命名部分文件,那么会新建一个目录,然后将文件重命名并移动到新文件夹
        os.renames(file, ext_name + '/' + file)
    
    
  • 增加容错处理
    • 1、当给定的路径不存在时,不做容错处理,系统会报错崩溃
    • 2、当变量的时候内部是文件夹时,会报错
    import os
    
    path = 'file2'
    
    if not os.path.exists(path):
        print(f'路径【{path}】不存在!')
        exit()
    # 由于后续操作都在file目录内,所以切换默认目录
    os.chdir(path)
    
    # 1、获取所有文件名称列表
    file_name = os.listdir('./')
    
    # 2、遍历所有文件名称
    for file in file_name:
        # 3、分解文件的后缀名
        if len(file.split('.')) == 1:
            continue
        ext_name = file.split('.')[-1]
        # 5、 将文件移动到目录中,利用修改多级 目录/文件名称的特性
        # 如果重命名部分文件,那么会新建一个目录,然后将文件重命名并移动到新文件夹
        os.renames(file, ext_name + '/' + file)
    
  • 增加文件清单
    import os
    
    path = 'file'
    
    if not os.path.exists(path):
        print(f'路径【{path}】不存在!')
        exit()
    # 由于后续操作都在file目录内,所以切换默认目录
    os.chdir(path)
    
    # 1、获取所有文件名称列表
    file_name = os.listdir('./')
    
    # 2、遍历所有文件名称
    for file in file_name:
        # 3、分解文件的后缀名
        if len(file.split('.')) == 1:
            continue
        ext_name = file.split('.')[-1]
        # 5、 将文件移动到目录中,利用修改多级 目录/文件名称的特性
        # 如果重命名部分文件,那么会新建一个目录,然后将文件重命名并移动到新文件夹
        os.renames(file, ext_name + '/' + file)
    
    
    def FileNameToTxt(dir, file):
        # 1、 获取路径下文件列表
        file_list = os.listdir(dir)
        # 2、 遍历文件列表
        for file_name in file_list:
            # 3、 判断文件是否是文件夹
            new_fileName = dir + '/' + file_name
            # new_fileName = file_name
            if os.path.isdir(new_fileName):
                # 4、 是文件夹,则输出文件夹名称并调用FileNameToTxt
                file.write(new_fileName + '\n')
                FileNameToTxt(new_fileName, file)
            else:
                # 5、 不是文件夹,则输出文件名称
                file.write('\t' + file_name + '\n')
        file.write('\n')
    
    
    os.chdir('../')
    f = open('filename.txt', 'a')
    FileNameToTxt('file', f)
    f.close()
    
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失心疯_2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值