如何根据用户输入选择指定Pandas DataFrame并保存为XLS文件?
解决Python/Pandas根据用户输入选择DataFrame并保存为Excel的问题
你遇到的核心问题很明确:input()获取的是字符串形式的DataFrame名称,但你实际需要的是对应的DataFrame对象——直接用字符串调用to_excel()肯定会触发AttributeError,因为字符串类型根本没有这个方法。下面给你几个实用的解决思路:
方法1:通过全局/局部作用域字典获取对象
Python中,全局变量存储在globals()字典里,局部变量在locals()字典里。你可以通过这个字典根据字符串键获取对应的DataFrame对象:
首先修改你的保存函数,让它直接接收DataFrame对象,还能自定义文件名(更灵活):
import pandas as pd path = 'C:\\Files\\' def excel_save(df, filename): writer = pd.ExcelWriter(path + filename) df.to_excel(writer, 'Sheet1') writer.save()
然后在主逻辑里获取并验证对象:
# 假设你已经定义了AAPL等DataFrame df_name = input('Enter the name of the DataFrame to be saved as XLS ==>') # 从全局作用域中获取对应名称的对象 target_df = globals().get(df_name) # 验证获取到的是不是DataFrame if isinstance(target_df, pd.DataFrame): # 用DataFrame的名字作为文件名,更直观 excel_save(target_df, f"{df_name}.xls") else: print(f"错误:找不到名为'{df_name}'的DataFrame!")
方法2:提前将DataFrame存入字典(更推荐)
直接操作全局变量有一定风险(比如可能误获取到其他无关变量),更安全的方式是提前把所有需要被选择的DataFrame放到一个字典中:
import pandas as pd import pandas_datareader as pdr import datetime as dt path = 'C:\\Files\\' def excel_save(df, filename): writer = pd.ExcelWriter(path + filename) df.to_excel(writer, 'Sheet1') writer.save() # 定义DataFrame并存入字典 start = dt.date(2017,12,1) end = dt.date(2018,1,4) dfs = { 'AAPL': pdr.get_data_yahoo('AAPL', start, end), # 可以继续添加其他DataFrame,比如'GOOG': pdr.get_data_yahoo('GOOG', start, end) } # 主逻辑 df_name = input('Enter the name of the DataFrame to be saved as XLS ==>') target_df = dfs.get(df_name) if target_df is not None: excel_save(target_df, f"{df_name}.xls") else: print(f"错误:集合中没有名为'{df_name}'的DataFrame!")
为什么你之前用exec的方法无效?
exec()函数的作用是执行一段字符串代码,但它不会返回任何值——所以exec(df_name)只是在解释器中执行了"AAPL"这个变量名,但没有把AAPL对象返回给你,传递给excel_save()的其实是None,自然无法正常保存。同理exec('df_name')也只是执行了变量名本身,没有帮你获取到对应的DataFrame对象。
内容的提问来源于stack exchange,提问作者Fabio Pomi
相关产品推荐
相关产品推荐

