Python自动化办公04篇

2,244 阅读4分钟

背景

故事是这样的,我的一个朋友他有十多个 excel 文件需要合并~当时给他提供了实现的思路。但转身一想,万一我的朋友中还有需要如此重复操作耽误了与小姐姐约会咋办?不行,你们不能跟我一样。所以为了美好的明天,今儿还是好好学习吧~

实战

需求 将 files 文件夹下的所有文件的数据合并成一个总文件(注意:每个文件的表头都一致)

实现步骤

  • 获取 files 文件夹下的所有文件名称
  • 读取每个文件的数据
  • 将每个文件的数据进行拼接
  • 保存至新的文件

获取 files 文件夹下的所有文件名称

首先,我们应该思考的是,Python有没有对应的模块可以帮助我们去获取指定文件夹下所有文件的名称,那文件夹实际上是在操作系统上的(比如:windows,mac),所以,我们就可以使用Python与操作系统交互的模块:os模块

# 导入os
import os

# 改变当前工作路径 至所有文件所在的文件夹下
need_dir = os.chdir(r"C:\Users\lenovo\Desktop\data_ana02\04-auto_merge_files\files")

# 列出所有文件的名称 以列表呈现
need_file_name = os.listdir(need_dir)
need_file_name

执行效果

读取每个文件的数据

在这儿,我们就需要思考,怎么读取文件的数据?哇奥~在 Python 中,那是有相当多的模块可以读取呀,比如:xlrd,openpyxl,numpy,pandas..那选择谁呢?在这个应用场景下,我强烈推荐 pandas

# 导入pandas
import pandas as pd
# 读取 云南白药.csv
ylby_df = pd.read_csv("云南白药.csv")
# 显示前五条
ylby_df.head()

执行效果

大家会发现,读取不同的文件只需要传入不同的文件名就行,那我们怎么读取文件夹下列表的所有文件的数据呢?

  • 使用 for 循环遍历文件列表
  • 再读取数据
# 取出每个文件的名称
for file_name in need_file_name:
    # 读取每个文件的数据    
    data = pd.read_csv(f"{file_name}")
    print(data.head())

截取其中一部分

将每个文件的数据进行拼接

怎么将数据如下拼接呢?

那还是使用到我们的老朋友pandas,我们可以使用 pandas.concat() 堆叠拼接。比如,两个表格的拼接代码如下

# 获取 云南白药.csv 数据
ylby_df = pd.read_csv("云南白药.csv")

# 获取 五粮液.csv 数据
wly_df = pd.read_csv("五粮液.csv")

# 进行堆叠拼接,注意:多个表格的拼接传入元组或列表
pd.concat((ylby_df,wly_df))

执行效果

那所有文件的数据怎么拼接?此时我们就需要借助到 pandas.concat() 拼接数据,实质上是将每个 df 数据装进一个 列表或者元组中,传进去~

# 定义 空的数据列表
data_li = []

# 取出每个文件的名称
for file_name in need_file_name:
    # 读取每个文件的数据    
    data = pd.read_csv(f"{file_name}")
    
    # 将数据添加到 空的数据列表中
    data_li.append(data)
    
# print(len(data_li))   # 列表长度返回为4 ,说明构建成功

# 拼接所有文件的数据
all_data = pd.concat(data_li)  

# 获取数据的形状 为620行,说明成功
all_data.shape

保存至新的文件

保存文件直接使用 df.to_csv() 就好了

all_data.to_csv("总数据.csv")  

...不管你文件夹下多少个文件都是一样的,赶紧玩起来吧~

完整代码

import os
import pandas as pd

# 改变当前工作路径 至所有文件所在的文件夹下
need_dir = os.chdir(r"C:\Users\lenovo\Desktop\data_ana02\04-auto_merge_files\files")
# 列出所有文件的名称 以列表呈现
need_file_name = os.listdir(need_dir)
def concat_file(file_name_li):
    data_li = []   
    # 3.循环取出每个 文件名
    for file_name in file_name_li:
        # 读取数据
        # print(file_name)
        data = pd.read_csv(f"{file_name}")
        # 将读取的数据添加到一个列表中
        data_li.append(data)  
    # 进行拼接
    all_data = pd.concat(data_li)
    # 保存文件
    all_data.to_csv("总数据.csv")  
concat_file(need_file_name) 

代码不是很多,想要学习自动化办公的同学。可以把这篇文章当做一个案例自己动手去敲一下,我们的学习,只要把门槛降低了,相信每一位同学都是可以学会互联网编程的。