Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import pandas as pd | |
| import re | |
| # 提取文件名中的所有数字作为时间戳 | |
| def extract_timestamps(file_name): | |
| # 使用正则表达式提取所有的数字 | |
| timestamps = re.findall(r'(\d+)', file_name) | |
| # 将这些数字转换为整数,返回列表 | |
| return [int(ts) for ts in timestamps] | |
| # 根据提取的时间戳列表排序 | |
| def sort_by_timestamps(file_name): | |
| # 提取所有时间戳,并按自然顺序进行排序 | |
| timestamps = extract_timestamps(file_name) | |
| # 返回时间戳中的最小值作为排序的主键 | |
| return timestamps | |
| def csv_to_dict(df): | |
| df = df.fillna('') | |
| res = {} | |
| for i, row in df.iterrows(): | |
| if row['CRN'] not in res: | |
| res[ row['CRN' ] ] = { | |
| 'Instructor': row['Instructor'], | |
| 'Now': row['Now'], | |
| } | |
| return res | |
| def compare_dicts(dict_a, dict_b): | |
| # 遍历两个字典,查找 Instructor 或 Now 不同的CRN | |
| changed = [] | |
| all_crns = set(dict_a.keys()).union(set(dict_b.keys())) | |
| for crn in all_crns: | |
| instructor_a = dict_a.get(crn, {}).get('Instructor', None) | |
| instructor_b = dict_b.get(crn, {}).get('Instructor', None) | |
| max_a = dict_a.get(crn, {}).get('Now', None) | |
| max_b = dict_b.get(crn, {}).get('Now', None) | |
| # 如果Instructor或Max不同,则记录CRN | |
| if instructor_a != instructor_b: | |
| msg = ' * CRN: {}, Instructor change: {} --> {}'.format(crn, instructor_a, instructor_b) | |
| changed.append(msg) | |
| if max_a != max_b: | |
| msg = ' * CRN: {}, Now change: {} --> {}'.format(crn, max_a, max_b) | |
| changed.append(msg) | |
| return changed | |
| def process_files(files): | |
| if len(files) < 2: | |
| return "Please upload at least 2 files." | |
| # 根据文件名中的时间戳进行排序 | |
| files_sorted = sorted(files, key=sort_by_timestamps) | |
| result = [] | |
| # 对排序后的文件进行两两比较 | |
| for i in range(len(files_sorted) - 1): | |
| df_older = pd.read_csv(files_sorted[i].name) | |
| df_newer = pd.read_csv(files_sorted[i + 1].name) | |
| dict_a = csv_to_dict(df_older) | |
| dict_b = csv_to_dict(df_newer) | |
| f1 = files_sorted[i].name.split('/')[-1] | |
| f2 = files_sorted[i+1].name.split('/')[-1] | |
| crns = compare_dicts(dict_a, dict_b) | |
| if crns: | |
| result.append("{} --> {} \n{}".format(f1, f2, "\n".join(crns))) | |
| else: | |
| result.append("{} --> {} \n * No change.".format(f1, f2)) | |
| return "\n".join(result) | |
| # 使用Gradio构建界面 | |
| gr.Interface( | |
| fn=process_files, | |
| inputs=gr.Files(label="Upload CSV files"), | |
| outputs="text", | |
| title="Course Schedule Tracker", | |
| description="Upload multiple CSV files, sort them based on the timestamp in the filenames, compare two adjacent files at a time, and output the CRNs where the 'Instructor' or 'Now' has changed." | |
| ).launch() | |