Python将列表数据转为行格式写入Excel独立工作表
解决方案
要实现列表结构化展示+多工作表Excel输出,不需要改动你原有CSV读取、数据对比的核心逻辑,只需要补充控制台格式化打印、Excel写入模块即可。
首先安装依赖包,用于生成多sheet的xlsx文件:pip install pandas openpyxl
完整可运行代码
代码保留你原有的全部对比逻辑,新增了结构化逐行打印、分类写入独立Excel工作表的功能:
import csv import os import sys import pandas as pd path_quarter_1 = os.path.join(sys.path[0], "Quarter_1.csv") # Q1数据路径 path_quarter_2 = os.path.join(sys.path[0], "Quarter_2.csv") # Q2数据路径 output_excel = os.path.join(sys.path[0], "季度数据对比结果.xlsx") # 输出结果Excel路径 # 读取CSV数据 with open(path_quarter_1, "r", encoding="utf-8") as f: reader = csv.reader(f) data_q1 = list(reader) with open(path_quarter_2, "r", encoding="utf-8") as f: reader = csv.reader(f) data_q2 = list(reader) # 提取公共表头 table_header = data_q1[0] account_col_header = ["Account"] # ---------------------- 原有对比逻辑 开始 ---------------------- # 两季度同时存在的Account account_in_both = [] for i in range(1, len(data_q1)): for j in range(1, len(data_q2)): if data_q1[i][2] == data_q2[j][2]: account_in_both.append(data_q1[i][2]) # 仅Q1存在的Account account_in_q1_not_q2 = [] for i in range(1, len(data_q1)): if data_q1[i][2] not in account_in_both: account_in_q1_not_q2.append(data_q1[i][2]) # 仅Q2存在的Account account_in_q2_not_q1 = [] for i in range(1, len(data_q2)): if data_q2[i][2] not in account_in_both: account_in_q2_not_q1.append(data_q2[i][2]) # 两季度完全一致的行 all_rows_are_same_in_both = [] for i in range(1, len(data_q1)): for j in range(1, len(data_q2)): if data_q1[i] == data_q2[j]: all_rows_are_same_in_both.append(data_q1[i]) # 仅Q1存在的行 rows_in_q1_not_q2 = [] for i in range(1, len(data_q1)): if data_q1[i] not in all_rows_are_same_in_both: rows_in_q1_not_q2.append(data_q1[i]) # 仅Q2存在的行 rows_in_q2_not_q1 = [] for i in range(1, len(data_q2)): if data_q2[i] not in all_rows_are_same_in_both: rows_in_q2_not_q1.append(data_q2[i]) # ---------------------- 原有对比逻辑 结束 ---------------------- # ---------------------- 新增:控制台结构化打印 开始 ---------------------- def print_formatted_result(title, data, is_full_row=False): print("="*80) print(f"【{title}】 共{len(data)}条记录") print("-"*80) # 打印表头 if is_full_row: print("\t".join(table_header)) print("-"*80) # 逐行打印数据 for row in data: if is_full_row: print("\t".join(row)) else: print(row) print("\n") # 逐类打印结果 print_formatted_result("两季度同时存在的账号", account_in_both) print_formatted_result("仅Q1存在的账号", account_in_q1_not_q2) print_formatted_result("仅Q2存在的账号", account_in_q2_not_q1) print_formatted_result("两季度完全一致的数据行", all_rows_are_same_in_both, is_full_row=True) print_formatted_result("仅Q1存在的数据行", rows_in_q1_not_q2, is_full_row=True) print_formatted_result("仅Q2存在的数据行", rows_in_q2_not_q1, is_full_row=True) # ---------------------- 新增:控制台结构化打印 结束 ---------------------- # ---------------------- 新增:写入多工作表Excel 开始 ---------------------- with pd.ExcelWriter(output_excel, engine="openpyxl") as writer: # 账号类结果写入对应sheet pd.DataFrame(account_in_both, columns=account_col_header).to_excel(writer, sheet_name="两季度共有账号", index=False) pd.DataFrame(account_in_q1_not_q2, columns=account_col_header).to_excel(writer, sheet_name="仅Q1存在账号", index=False) pd.DataFrame(account_in_q2_not_q1, columns=account_col_header).to_excel(writer, sheet_name="仅Q2存在账号", index=False) # 整行类结果写入对应sheet pd.DataFrame(all_rows_are_same_in_both, columns=table_header).to_excel(writer, sheet_name="两季度一致行", index=False) pd.DataFrame(rows_in_q1_not_q2, columns=table_header).to_excel(writer, sheet_name="仅Q1存在行", index=False) pd.DataFrame(rows_in_q2_not_q1, columns=table_header).to_excel(writer, sheet_name="仅Q2存在行", index=False) print(f"所有结果已写入文件:{output_excel}") # ---------------------- 新增:写入多工作表Excel 结束 ----------------------
效果说明
- 控制台输出会按分类加分隔线、显示记录总数、带表头逐行打印,不会再出现整段列表挤在一起难以阅读的问题
- 生成的Excel文件和两个源CSV存放在同一目录,6类结果分别存在6个独立工作表中,自带列名,打开即可直接筛选查阅
- 如果你的CSV文件不是utf-8编码,把代码里
open()的encoding参数改成对应编码即可,比如gbk、utf-8-sig
内容的提问来源于stack exchange,提问作者rickz
相关产品推荐
相关产品推荐

