一、需求
每天会生成一个记录文件(文件名按日期yyyyMMdd格式命名),记录文件中记录有条形码的内容,需要合并最近20次的数据,并提取出有重复的条形码。
也可以进行最近30天数据的合并,需要修改次数判断为日期判断即可。
二、处理方式
1、遍历存放记录文件的文件夹,并将获取的文件名进行排序;
2、根据条件过滤不需要的文件,然后将所有读取的文件使用pandas 的concat函数进行合并;
3、使用duplicated函数判断是否有重复;
4、输出有重复的条形码值。
三、代码实现
import datetime
import os
import shutil
import pandas as pd
current_date = datetime.date.today()
ls = []
files = os.listdir("记录文件")
files = sorted(files, reverse=True) # 对文件进行逆序排序
count = 0
for file in files:
if '模板' not in file and file.endswith('.xlsx'): # 只选择xlsx后缀的文件,并剔除文件名中有"模板"的文件
file_path = os.path.join("记录文件", file)
df = pd.read_excel(file_path)
ls.append(df)
count += 1
if count == 20: # 选择最近的20个文件
break
output = pd.concat(ls)
oupt_name = f'{datetime.date.today()}合并的数据.csv'
output.to_csv(oupt_name, encoding='gbk')
data = pd.read_csv(oupt_name, encoding='gbk')
data['是否重复'] = data['条码值'].duplicated(keep=False)
duplicate_barcodes = data[data['是否重复'] == True]
if len(duplicate_barcodes['是否重复'].tolist()) != 0:
duplicate_barcodes.to_csv('有重码的文件.csv', encoding='gbk')
if not os.path.exists("合并后的文件"):
os.makedirs("合并后的文件")
if not os.path.exists("有重码的文件"):
os.makedirs("有重码的文件")
shutil.move(oupt_name, os.path.join("合并后的文件", oupt_name))
shutil.move('有重码的文件.csv', os.path.join("有重码的文件", '有重码的文件.csv'))
如果是最近30天的文件,合并文件的代码如下,判断是否重复的代码不变:
current_date = datetime.date.today() - datetime.timedelta(days=30)
date_string = current_date.strftime("%Y%m%d")
print("当前日期:", date_string)
ls = []
for file in os.scandir():
if '模板' not in file.name:
if file.name.endswith('xlsx'):
file_date = datetime.datetime.strptime(file.name[:-5], "%Y%m%d").date()
if file_date > current_date:
df = pd.read_excel(file.name)
ls.append(df)
output = pd.concat(ls)