递归函数执行后Pandas DataFrame返回None?求技术排查
问题分析与解决方案
嘿,我一眼就瞅出问题所在了——你的递归函数在递归调用环节没把结果传递回来!
你看,当iter > 0的时候,你调用了findSubFoldersMultiple(iter-1, combined_data_container),但这个调用的结果你没有返回给上层函数。所以当递归一层层往回走时,每一层函数执行完这个调用后,都没有任何return语句,自然就默认返回None了——哪怕最底层的else分支确实返回了正确的DataFrame,也没法传递到顶层调用里。
给你修复好的代码,还加了几个实用小优化:
import sys, os, glob from glob import glob import pandas as pd def findSubFoldersMultiple(iter, data_container): if iter > 0: current_directory = sys.argv[iter] # 用os.path.join拼接路径,适配Windows/Linux不同的路径分隔符 directory_reformatted = os.path.join(current_directory, "*", "") folders = glob(directory_reformatted) # 用os.path.relpath替代手动字符串替换,更可靠地获取子文件夹名称 folders_stripped = [os.path.relpath(folder, current_directory).replace(os.sep, "") for folder in folders] curr_data_container = pd.DataFrame({current_directory: folders_stripped}) combined_data_container = pd.concat([data_container, curr_data_container], axis=1) # 关键修复:把递归调用的结果返回给上层 return findSubFoldersMultiple(iter-1, combined_data_container) else: print('Populated container in loop: \n') print(data_container) return data_container if len(sys.argv)<2: print ("Please specify directory/directories.") else: writer = pd.ExcelWriter('subfolders.xlsx') empty_frame = pd.DataFrame({}) populated_DF = findSubFoldersMultiple(len(sys.argv) - 1, empty_frame) print('Returned container: \n') print(populated_DF) # 补上原代码遗漏的Excel保存步骤 populated_DF.to_excel(writer, index=False) writer.close()
关键说明:
- 核心修复:在
iter > 0的分支里添加return,让递归调用的结果能逐层传递回去,这样顶层的populated_DF就能拿到最终拼接好的DataFrame了。 - 路径处理优化:用
os.path.join和os.path.relpath替代手动拼接/替换字符串,避免因为系统路径分隔符(Windows是\,Linux是/)导致的错误。 - 补充Excel保存:原代码只创建了ExcelWriter,但没有把DataFrame写入文件并关闭Writer,现在补上了这一步,运行后就能得到真正的
subfolders.xlsx文件了。
内容的提问来源于stack exchange,提问作者dnv
相关产品推荐
相关产品推荐

