我有一个棘手的问题,试图比较excel文件中的工作表,我有很多。问题是这样的:
我有一个大约1000 .xlsx文件的目录,每个文件按顺序日期,每个文件有16个工作表。每个文件都是对某一天的数字的预测,使用连续4天的数据加上前一周的星期六(如果不包含星期六)。
例如,如果我预测2022年12月17日,文件名将是xxx_1217.xlsx
,其中的前5个工作表将被称为['10-12','13-12','14-12','15-12','16-12']
。因为10号是星期六,所以11号和12号就被跳过了。
我们把这个文件命名为1.
现在文件夹中的下一个文件将是第二天,2022年12月18日,包含4个相同的日子加上一个新的,这是我们试图预测的实际结果(不是我们预测的那一天),所以这个文件将被称为xxx_1218.xlsx
,并包含以下5个表['17-12','13-12','14-12','15-12','16-12']
。顺序不重要,17号是星期六。
我们把这个文件命名为2.
现在问题来了。我想检查文件1中的工作表,与文件2中的日期相同。包含完全相同的数据。然后遍历每个后续文件并进行相同的比较。因此,在将文件1的工作表与文件2进行比较之后,应该将文件2的工作表与文件3进行比较,以此类推。
到目前为止,我有以下代码,它做了很多工作来从目录中获取文件,工作表的名称,然后从字典中创建一个相关的列表。键,然后在数据框架中调用它们来比较它们。import pandas as pd
import os
from datetime import date
path_root =r'C:UsersFiles'
filenames = [file for file in os.listdir(path_root) if file.endswith('.xlsx')]
keys_list = []
df1_keys_list = []
df2_keys_list = []
for i in range(len(filenames)):
filename = filenames[i]
filename_compare = filenames[i+1]
day = filename[-7:-5]
month = filename[-9:-7]
day_compare = filename_compare[-7:-5]
month_compare = filename_compare[-9:-7]
filename_compare = 'prealign_debug_'+month_compare+day_compare+'.xlsx'
Path_1 = os.path.join(path_root,filename)
Path_2 = os.path.join(path_root,filename_compare)
df1 = pd.read_excel(Path_1, sheet_name=None)
df2 = pd.read_excel(Path_2, sheet_name=None)
for j in df1.keys():
df1_keys_list.append(j)
df1_days = df1_keys_list[0:5]
for k in df2.keys():
df2_keys_list.append(k)
df2_days = df2_keys_list[0:5]
df3 = pd.read_excel(Path_1, sheet_name=df1_days[1])
df4 = pd.read_excel(Path_1, sheet_name=df1_days[2])
df5 = pd.read_excel(Path_1, sheet_name=df1_days[3])
df6 = pd.read_excel(Path_2, sheet_name=df1_days[0])
df7 = pd.read_excel(Path_2, sheet_name=df1_days[1])
df8 = pd.read_excel(Path_2, sheet_name=df1_days[2])
[print('correct') if df3.equals(df6) else print('incorrect')]
[print('correct') if df4.equals(df7) else print('incorrect')]
[print('correct') if df5.equals(df8) else print('incorrect')]
这有点麻烦,可能有更巧妙的方法,但我就是这么做的。
出现了两个问题,一:这里的循环结构有问题
for j in df1.keys():
df1_keys_list.append(j)
df1_days = df1_keys_list[0:5]
作为列表df1_keys_list
,当它应该是5个元素时,它最终是95个元素。也许有一个更好的方法来制作键列表来引用工作表?
其次,我知道它不起作用,因为我比较了5个完全相同的文件,当我在其中一个文件中更改一个条目时,当我运行脚本时,我仍然得到'correct'
打印语句,除非,当我更改第二个文件中的条目时…
我该如何整理,我做错了什么?
下面是您的代码的重构版本,其中我创建了一个compare_file函数,以便代码更加模块化,我将键转换为列表并使用列表切片来简化前5个元素,我在循环中添加了if语句,而不是列表推导式。
import pandas as pd
import os
path_root = r'C:UsersFiles'
filenames = [file for file in os.listdir(path_root) if file.endswith('.xlsx')]
def compare_files(file1, file2):
df1 = pd.read_excel(file1, sheet_name=None)
df2 = pd.read_excel(file2, sheet_name=None)
df1_days = list(df1.keys())[:5]
df2_days = list(df2.keys())[:5]
common_days = set(df1_days) & set(df2_days)
for day in common_days:
if df1[day].equals(df2[day]):
print(f'{day} in {file1} and {file2} are correct')
else:
print(f'{day} in {file1} and {file2} are incorrect')
for i in range(len(filenames) - 1):
filename1 = os.path.join(path_root, filenames[i])
filename2 = os.path.join(path_root, filenames[i + 1])
compare_files(filename1, filename2)