我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈
Python基础进阶_文件其他操作
文件其他操作
- 文件的其他相关操作都是基于
os
模块的,所以在开始的时候需要导入模块import os
- 本文中用到了
os
、os.path
、shutil
模块
重命名操作
- 方法
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()