Python函数导入后无返回且不执行问题求助
Python Pandas函数模块调用问题解决方案
问题描述
我花了数小时自行调试却毫无进展,急需技术帮助。编写了function1.py模块,其中getMerged函数借助Pandas读取多个CSV文件,按规则合并后需完成两项操作:1)打印合并后的DataFrame;2)将DataFrame写入Excel文件。
当function1.py作为主程序运行(文件末尾添加调用代码)时,函数运行完全正常。但将其作为模块导入其他文件调用时(仅保留函数定义,删除末尾调用代码),出现以下问题:
- 无法在函数外部获取返回的
composite对象,尝试过return语句、全局变量、赋值给变量等多种方法均无效; - 在
other.py中导入getMerged并调用时,无报错但函数完全不执行; - 曾在函数内添加递归调用,虽有反应但陷入无限循环,仍无法实现预期效果。
相关代码
function1.py的函数定义
def getMerged(csv_files, output_name): import pandas as pd list_of_expiry_dfs = [] for csvfile in csv_files: names = ['date', 'open', 'high', 'low', 'close', 'vol'] df = pd.read_csv(csvfile, sep=';', names=names) df = df.set_index('date') list_of_expiry_dfs.append(df) x = 1 composite = list_of_expiry_dfs[0] for each in list_of_expiry_dfs: composite = composite.join(each, lsuffix=x-1, rsuffix=x, how='outer') x = x + 1 yaxis =[] for expiry in csv_files: open_col = 'open (' + expiry[:6] + ")" high_col = 'high (' + expiry[:6] + ")" low_col = 'low (' + expiry[:6] + ")" close_col = 'close (' + expiry[:6] + ")" vol_col = 'vol (' + expiry[:6] + ")" yaxis.append(open_col) yaxis.append(high_col) yaxis.append(low_col) yaxis.append(close_col) yaxis.append(vol_col) composite.columns = yaxis print(composite) composite.to_excel(output_name, header=True)
注:代码中把
open变量名改为open_col,避免与内置函数open冲突
function1.py作为主程序时的调用代码
csv_files = [ 'BZ1219.csv', 'BZ0120.csv', 'BZ0220.csv', 'BZ0320.csv', 'BZ0420.csv' ] getMerged(csv_files, output_name='test.xlsx')
other.py的导入调用代码
csv_files = ['BZ1219.csv','BZ0120.csv','BZ0220.csv','BZ0320.csv','BZ0420.csv'] output_name = "test.xlsx" from function1 import getMerged getMerged(csv_files=csv_files, output_name=output_name)
解决方案
1. 解决无法获取返回composite对象的问题
当前函数没有返回值,只需在函数末尾添加return composite语句,调用时将函数结果赋值给变量即可获取:
修改后的getMerged函数末尾:
print(composite) composite.to_excel(output_name, header=True) return composite # 新增返回语句
在other.py中调用时获取返回值:
result = getMerged(csv_files=csv_files, output_name=output_name) # 现在result即为合并后的DataFrame对象,可进行后续操作
2. 解决other.py调用函数无执行的问题
按以下步骤排查修正:
- 检查文件路径:确保
function1.py与other.py在同一目录,或function1.py所在目录已加入Python的sys.path; - 检查CSV文件位置:
csv_files使用的是相对路径,需确保这些CSV文件与other.py在同一目录,或改用绝对路径; - 安装依赖库:执行
pip install pandas openpyxl,确保pandas和openpyxl(写入Excel必需)已安装; - 修正合并逻辑bug:原循环会将第一个DataFrame与自身合并,导致重复列,应从第二个DataFrame开始循环:
composite = list_of_expiry_dfs[0] x = 1 for each in list_of_expiry_dfs[1:]: # 从第二个元素开始遍历 composite = composite.join(each, lsuffix=x-1, rsuffix=x, how='outer') x += 1
3. 解决递归调用导致无限循环的问题
该场景完全不需要递归调用,直接删除函数内的递归代码即可,使用普通循环处理CSV文件合并逻辑就足够。
内容的提问来源于stack exchange,提问作者redpowertie
相关产品推荐
相关产品推荐

