有多个excel表,total文件夹中有多个csv表格:每个csv文件中有ID、ID、名称、大小等多个列,表2中有ID、名称两列。
任务:通过ID和名称来匹配表1和表2的数据,并将表1对应的大小补充到表2的最后一列
我们通过 pandas 库来处理我们的数据,os 来进行文件操作,首先导入
import pandas as pd
import os
注意:一定要看清楚文件的编码方式,我这里是csv格式的文件,编码方式为“ansi”
如果不清楚文件的编码方式,可以用记事本打开,右下角就有编码方式
接着可以开始读取文件
# 首先读取表2
# path_total是文件完整路径
# 用 pandas 的read_csv 方法读取,如果是excel表格就是 read_excel
total_form = pd.read_csv(path_total, encoding=encoding)
注意:在读取和写入文件时,一定要注意编码方式!!!
# 读取total文件夹中的表格
for file in os.listdir(path_month):
# 拼接路径
file_path = os.path.join(path_month, file)
# 获取total中各个文件的sheet名
monthly_sheetname = file[:-4]
# 读取文件,读取时跳过首行
# 这里是根据我的表格内容进行调整,不需要可以去掉
monthly_form = pd.read_csv(file_path, encoding=encoding, skiprows=1)
# 筛选出要匹配的列
# :前面代表行,为空则代表所有行,冒号后面代表列,2、3、7分别代表第3、4、8列(索引从0开始)
monthly_data = monthly_form.iloc[:, [2, 3, 7]]
total_data = total_form.iloc[:, [0, 1]]
# 重命名列
# 由于我的文件中有两个列名相同,均叫做“ID”,因此将第一个ID列重命名,避免重复
monthly_data.rename(columns={'ID': 'ID_旧', 'ID.1': 'ID'}, inplace=True)
# 合并两个表格
merged_form = pd.merge(monthly_data, total_data, on=['ID', '名称'], how='right')
# 创建新列并赋值
merged_form[monthly_sheetname] = merged_form.pop('大小')
# 找到表2最后一个非空列的索引
# 先找到最后一个非空列的列名last_non_empty_column_index,再通过get_loc()方法获取该列的索引last_column_index
last_non_empty_column_index = total_form.columns[-1]
last_column_index = total_form.columns.get_loc(last_non_empty_column_index)
# 在 total_form 的最后一个非空列的右侧插入新列
total_form.insert(last_column_index + 1, monthly_sheetname, merged_form[monthly_sheetname])
# 循环结束后,将更新后的 total_form 写入 CSV 文件
total_form.to_csv(path_total, index=False, encoding="ansi")