python中几秒钟就能批量处理文件的几种操作!最后一种很常见!

2021-08-05 15:31:00 浏览数 (2)

Hi~ 大家好!

本文讲解一些我在生活中遇到或者想到的内容,其中一些操作如果一个一个的进行,会很累,所以本文用python进行简化操作,节省时间。本文会用到osshutil以及pandas模块,其中osshutil本文会交叉使用,进行互补。

本次示例数据就不用猫眼电影100了,换个新的,一份前员工名单:

以及一份离职员工信息:

创建文件

导入模块

代码语言:javascript复制
import pandas as pd
import os
import shutil

先创建单个文件夹,判断文件夹是否存在,不存在则创建单个文件夹,后面的案例都在该文件夹中进行:

代码语言:javascript复制
if not os.path.exists('员工档案'):
    os.mkdir('员工档案')

那如何在一级文件夹中按指定名称创建多个文件夹呢?可以先导入需要创建文件夹的名称,接着进行循环取值:

代码语言:javascript复制
df = pd.read_csv('员工名单.csv', encoding='utf-8')
for i in df['姓名']:
    if not os.path.exists('./员工档案/'   i):
        os.mkdir('./员工档案/'   i)

而如果需要在二级文件夹里面继续创建文件,用os.mkdir他会报错:

代码语言:javascript复制
FileNotFoundError: [WinError 3] 系统找不到指定的路径。: './员工档案/丑八怪/丑八怪'

所以需要用os.makedirs进行创建:

代码语言:javascript复制
df = pd.read_csv('员工名单.csv', encoding='utf-8')
for i in df['姓名']:
    path = './员工档案/'   i   '/'   i
    if not os.path.exists(path):
        os.makedirs(path)

当然,一般很少会创建三级文件夹的,但会在二级文件夹里面创建一些其它文件。但你会发现,os他只能创建文件夹,而无法直接创建其它类型的文件;所以在此条件下我们要在二级文件夹里面创建其它文件,我们需要借用其它的模块;这里以创建excel表格为例,需要用到pandas模块:

代码语言:javascript复制
df = pd.read_csv('员工名单.csv', encoding='utf-8')
for i in df['姓名']:
    path = './员工档案/'   i   '/'
    if not os.path.exists(path):
        os.makedirs(path)
    df1 = pd.ExcelWriter(path   f'{i}.xlsx')
    df1.close()

在这里插入图片描述

移动文件以及重命名文件

移动单个文件并且重命名可以用os.rename(src, dst),src和dst为两个路径,分别表示重命名之前和之后的路径,但需要注意的是:移动时必须重命名,否则会报错。

代码语言:javascript复制
os.rename('./员工档案/丑八怪', './员工档案/乌鸦/丑八啊啊')

而只需要移动可以用上面的shutil模块中的move函数:

代码语言:javascript复制
shutil.move('./员工档案/乌鸦', './员工档案/丑八怪')

而如果需要把二级文件夹中的excel文件移动到一级文件夹下,应该进行以下操作:

代码语言:javascript复制
for e in os.listdir('./员工档案'): # 取出一级文件夹下的所有文件名称
    for i in os.listdir(f'./员工档案/{e}'): # 取出二级文件夹下的所有文件名称
        shutil.move(f'./员工档案/{e}/{i}', './员工档案')

如果你要移动文件且重命名,可以在shutil.move中或者把shutil.move更改为os.rename,并在移动后的路径中增加修改字样:

代码语言:javascript复制
shutil.move(f'./员工档案/{e}/{i}', './员工档案/2021_{i}')
os.rename(f'./员工档案/{e}/{i}', f'./员工档案/2021_{i}')

删除文件

删除单个文件夹,可以直接用shutilrmtree函数,而os他只能删除空的文件夹:

代码语言:javascript复制
shutil.rmtree('员工档案')

如果员工档案中,某些员工已经离职,需要删除其对应的文件,或者删除一些不需要的文件:

则依然使用个for循环即可:

代码语言:javascript复制
df = pd.read_csv('离职员工.csv', encoding='utf-8')
for i in df['姓名']:
    shutil.rmtree(f'./员工档案/{i}')

那么如何快速的从二级文件夹中删除离职员工对应的excel文件:

这时你如果直接用shutil.rmtree他是删除不了一个文件的,而os虽然无法删除有文件的目录,但他可以直接删除一个文件:

代码语言:javascript复制
df = pd.read_csv('离职员工.csv', encoding='utf-8')
for i in df['姓名']:
    if os.path.exists(f'./员工档案/{i}'): # 需要判断是否存在文件
        for e in os.listdir(f'./员工档案/{i}'): # 取出文件夹中的文件名称
            os.remove(f'./员工档案/{i}/{e}')

0 人点赞