Python实现字典写入CSV/XLSX:特定格式输出需求求助
我明白你要的表格结构了——A列从第二行开始是应用名称,B列及以后的表头是公司名称,交叉单元格是对应应用在该公司的计数。之前用csv.writer直接写iteritems()的方式,只会把每个应用-公司计数的键值对拆成零散的行,完全不符合你要的二维表格布局。
下面分CSV和XLSX两种方案给你实现:
方案1:导出为CSV文件
首先得先梳理数据的结构逻辑:
- 提取所有公司名称作为表头(从B列开始,所以表头第一个元素是空字符串,对应A1单元格)
- 提取所有应用名称作为A列的纵向内容(从第二行开始)
- 构建每行数据:应用名 + 对应各公司的计数(没有对应计数时填0或空值)
假设你的master字典结构是这样的(如果结构不同,核心逻辑可以微调):
master = { "应用X": {"公司甲": 10, "公司乙": 5}, "应用Y": {"公司甲": 3, "公司丙": 8}, "应用Z": {"公司乙": 7} }
对应的CSV生成代码:
import csv # 1. 收集所有唯一的公司名称,排序可选 companies = sorted({company for app in master.values() for company in app.keys()}) # 2. 构造表头:A1为空,后续是公司名 header = [""] + companies # 3. 准备每行数据:应用名 + 对应各公司的计数 rows = [] for app_name, company_counts in master.items(): row = [app_name] for company in companies: # 没有对应计数就填0,也可以换成""表示空单元格 row.append(company_counts.get(company, 0)) rows.append(row) # 4. 写入CSV文件,utf-8编码避免中文乱码 with open('app_company_counts.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(header) # 写入表头 writer.writerows(rows) # 写入所有行数据
生成的CSV打开后完全符合你的要求:
- A1为空,B1、C1等依次是公司名称
- A2开始纵向排列应用名,对应单元格显示该应用在对应公司的计数
方案2:导出为XLSX文件(用openpyxl)
如果需要导出为XLSX格式,推荐用openpyxl库(先通过pip install openpyxl安装),代码逻辑和CSV类似,还能额外设置格式(比如表头加粗):
from openpyxl import Workbook from openpyxl.styles import Font # 假设master字典结构同上 master = { "应用X": {"公司甲": 10, "公司乙": 5}, "应用Y": {"公司甲": 3, "公司丙": 8}, "应用Z": {"公司乙": 7} } wb = Workbook() ws = wb.active ws.title = "应用计数统计" # 1. 写入表头 companies = sorted({company for app in master.values() for company in app.keys()}) ws.cell(row=1, column=1).value = "" # A1留空 for col_idx, company in enumerate(companies, start=2): cell = ws.cell(row=1, column=col_idx) cell.value = company cell.font = Font(bold=True) # 表头加粗,可选设置 # 2. 写入应用名称和对应计数 row_idx = 2 for app_name, company_counts in master.items(): # 应用名写入A列 ws.cell(row=row_idx, column=1).value = app_name # 对应公司计数写入B列及以后 for col_idx, company in enumerate(companies, start=2): ws.cell(row=row_idx, column=col_idx).value = company_counts.get(company, 0) row_idx += 1 # 保存XLSX文件 wb.save('app_company_counts.xlsx')
小提示:
如果你的master字典结构和示例相反(比如以公司为键,对应应用计数),只需要调整遍历和提取数据的逻辑即可,核心是先明确行和列的维度,再填充对应的值。
内容的提问来源于stack exchange,提问作者DancinDeku
相关产品推荐
相关产品推荐

