使用Pandas导出Excel失败:仅显示表头无数据的问题排查
Excel导出仅显示表头无数据的问题排查与解决方案
问题描述
编写Python代码通过菜单交互调用自定义Functions模块完成计算任务,尝试用Pandas结合xlsxwriter将各功能的输入输出导出至Excel,但生成的文件仅显示表头,无实际数据填充。
核心问题分析
- 数据定义语法错误:
data变量第一行末尾多了一个逗号,导致整个data被解析为元组而非列表的列表,Pandas无法识别为有效数据行。 - 缺失Pandas类导入:代码中使用
DataFrame和ExcelWriter但未导入,实际运行会抛出NameError,导致导出逻辑无法执行。 - 变量覆盖问题:所有功能共用单个变量存储输入输出,多次执行同一功能会覆盖之前的数据,最终仅保留最后一次执行结果。
- 变量命名冲突:全局
data变量与功能5的输入变量重名,会导致数据被意外覆盖。
解决方案
1. 修正数据结构语法
移除data第一行末尾的逗号,确保其为列表的列表格式,并调整行内容匹配期望格式:
data = [ [nome_utilizador, '', '', '', nome_utilizador], # C1E1:功能1的输出 [nome_utilizador, numero1, numero2, '', resultadoex2], # C1E2:功能2的输入输出 [nome_utilizador, nota1, nota2, nota3, media_notas], # C1E3:功能3的输入输出 [nome_utilizador, altura, largura, '', area_retangulo], # C1E4:功能4的输入输出 [nome_utilizador, preco, valordado, '', troco], # C1E5:功能5的输入输出 [nome_utilizador, distancia, velocidade, '', tempo_de_viagem], # C1E6:功能6的输入输出 [nome_utilizador, combustivel_gasto, distancia2, '', Consumo], # C1E7:功能7的输入输出 [nome_utilizador, preco_restaurante, quantidade_pessoas, '', precopp] # C1E8:功能8的输入输出 ]
2. 补充Pandas导入语句
在代码开头添加:
from pandas import DataFrame, ExcelWriter
3. 修复变量命名冲突
将功能5的输入变量data改为data_nascimento,避免覆盖全局数据变量:
case "5": data_nascimento = input("Indique a sua data de nascimento dd/mm/aaaa\n") resultado = ex13(data_nascimento)
完整修正后的代码
from Functions import * import xlsxwriter from pandas import DataFrame, ExcelWriter # 补充Pandas类导入 if __name__ == "__main__" : # 拆分变量初始化,提高可读性 resposta1 = 'a' resposta2 = 'a' nome_utilizador = '' numero1 = numero2 = resultadoex2 = 0 nota1 = nota2 = nota3 = media_notas = 0 altura = largura = area_retangulo = 0.0 preco = valordado = troco = 0.0 distancia = velocidade = tempo_de_viagem = 0.0 combustivel_gasto = distancia2 = Consumo = 0.0 preco_restaurante = quantidade_pessoas = precopp = 0.0 golos_totais = jogos_totais = resultado = 0 preco_original = desconto = 0.0 seguidores_atuais = seguidores_antigos = 0 altura_utilizador = peso = 0.0 capital_inicial = taxa_de_juros = 0.0 tempo_anos = 0 quantia_euros = taxa_conversao = 0.0 while resposta1 != 'x': resposta2 = 'a' print(f'-------Menu-------') print(f'->1 Compêndio 1') print(f'->2 Compêndio 2/3') print(f'->x Sair') print(f'------------------') resposta1 = input('') match resposta1: case "1": while resposta2 != '0': print(f'-------Menu Compêndio 1-------\n') print(f'->1 "Olá utilizador"') print(f'->2 "Aritmia"') print(f'->3 "Média"') print(f'->4 "Área retangulo"') print(f'->5 "Troco"') print(f'->6 "Tempo de viagem"') print(f'->7 "Consumo de combustivel"') print(f'->8 Preco pp') print(f'->0 Voltar') print(f'->x Sair') print(f'------------------------------') resposta2 = input('') if resposta2 == 'x': resposta1 = 'x' resposta2 = '0' match resposta2: case "1": nome_utilizador = ex1() case "2": numero1 = int(input('Insira um número: ')) numero2 = int(input('Insira outro numero: ')) resultadoex2 = ex2(numero1,numero2) case "3": nota1= int(input('Insira as suas notas:\n')) nota2= int(input('')) nota3= int(input('')) media_notas= ex3(nota1,nota2,nota3) case "4": altura = float(input('Insira a altura: ')) largura = float(input('Insira a largura: ')) area_retangulo = ex4(altura,largura) case "5": preco = float(input('Insira o preco do produto:\n')) valordado = float(input('Insira o valor:\n')) troco = ex5(preco,valordado) case "6": distancia = float(input('Insira a distancia da viagem em km\n')) velocidade = float(input('Insira a velocidade média em km/h\n')) tempo_de_viagem = ex6(distancia,velocidade) case "7": combustivel_gasto = float(input('Insira o combustivel gasto em litros \n')) distancia2 = float(input('Insira a distancia percorrida em km\n')) Consumo = ex7(combustivel_gasto,distancia2) case "8": preco_restaurante = float(input('Insira o preco da refeição\n')) quantidade_pessoas = int(input('Insira a quantidade de pessoas\n')) precopp = ex8(preco_restaurante,quantidade_pessoas) case "2": while resposta2 != "0": print(f'------Menu Compêndio 2/3------\n') print(f'->1 "Golos por jogo"') print(f'->2 "Preço com desconto"') print(f'->3 "Crescimento de seguidores"') print(f'->4 "IMC"') print(f'->5 "Dias vividos"') print(f'->6 "Juros Simples"') print(f'->7 "Conversão para dolar"') print(f'->0 Voltar') print(f'->x Sair') print(f'------------------------------') resposta2 = input('') if resposta2 == 'x': resposta1 = 'x' resposta2 = '0' match resposta2: case "1": golos_totais = int(input('Insira a quantidade de golos marcados\n')) jogos_totais = int(input('Insira a quantidade de jogos jogados\n')) resultado = ex9(golos_totais,jogos_totais) case "2": preco_original = float(input('Insira o preco original\n')) desconto = int(input('Insira o desconto\n')) resultado = ex10(preco_original,desconto) case "3": seguidores_atuais = int(input('Insira a quantidade de seguidores que tem\n')) seguidores_antigos = int(input('Insira a quantidade de seguidores que tinha há um mês atrás\n')) resultado = ex11(seguidores_atuais,seguidores_antigos) case "4": altura_utilizador = float(input('Insira a sua altura\n')) peso = float(input('Insira o seu peso\n')) resultado = ex12(peso,altura_utilizador) case "5": data_nascimento = input("Indique a sua data de nascimento dd/mm/aaaa\n") resultado = ex13(data_nascimento) case "6": capital_inicial = float(input('Insira a capital inicial\n')) taxa_de_juros = float(input('Insira a taxa de juros\n')) tempo_anos = int(input('Insira a quantidade de anos\n')) resultado = ex14(capital_inicial,taxa_de_juros,tempo_anos) case "7": quantia_euros = float(input('Insira a quantidade em euros\n')) taxa_conversao = float(input('Insira a taxa de conversao para dolar\n')) resultado = ex15(quantia_euros,taxa_conversao) # 修正数据结构,移除多余逗号 data = [ [nome_utilizador, '', '', '', nome_utilizador], [nome_utilizador, numero1, numero2, '', resultadoex2], [nome_utilizador, nota1, nota2, nota3, media_notas], [nome_utilizador, altura, largura, '', area_retangulo], [nome_utilizador, preco, valordado, '', troco], [nome_utilizador, distancia, velocidade, '', tempo_de_viagem], [nome_utilizador, combustivel_gasto, distancia2, '', Consumo], [nome_utilizador, preco_restaurante, quantidade_pessoas, '', precopp] ] index = ['C1E1', 'C1E2', 'C1E3', 'C1E4', 'C1E5', 'C1E6', 'C1E7', 'C1E8'] columns = ['Nome', 'Input 1', 'Input 2', 'Input 3', 'Output'] df = DataFrame(data, columns=columns, index=index) writer = ExcelWriter('output.xlsx', engine='xlsxwriter') df.to_excel(writer, sheet_name='Sheet1', index=True) writer.close()
额外说明
- 若未执行某功能,对应行将保留初始化值(如0或空字符串),可添加判断逻辑跳过未执行的功能行。
- 若需要保留多次执行同一功能的历史数据,可改用列表存储每次操作的记录,再转换为DataFrame导出。
内容的提问来源于stack exchange,提问作者Herp
相关产品推荐
相关产品推荐

