使用相对路径保存DataFrame至CSV报错,绝对路径及单独运行正常
问题根源分析
你碰到的这个FileNotFoundError其实很好解释——脚本里的os.chdir(i)偷偷改了当前工作目录!当你循环遍历子目录时,每次调用os.chdir(i)都会把程序的当前工作目录切换到那个子文件夹里,之后再用相对路径Data\\Random\\...保存文件时,程序是从你切换后的子目录出发去找这个路径,自然找不到对应的文件夹了。
至于你说的两种特殊情况能正常工作的原因:
- 用绝对路径时:不管当前工作目录在哪,绝对路径都能精准定位到目标文件夹,所以不会出错。
- 不清除变量单独跑保存代码时:此时你的当前工作目录还是脚本最初启动的目录,
Data\\Random是相对于这个初始目录的,所以能顺利找到。
解决方案
这里给你三种靠谱的解决思路,按需选择:
方案1:避免随意切换工作目录(最推荐)
尽量别用os.chdir(),处理文件时直接用完整路径即可。修改你的循环逻辑,不用切换目录,直接把目录路径传给函数:
import os import pandas as pd check = "Data\\" def my_function(directory): # 函数里处理文件时,直接用directory拼接路径,比如: # example_file = os.path.join(directory, "target_file.csv") # df = pd.read_csv(example_file) return allvars; directories = [os.path.abspath(x[0]) for x in os.walk(check)] directories.remove(os.path.abspath(check)) list_of_df = [] for i in directories: try: # 去掉os.chdir(i),直接传入目录路径给函数 x = my_function(i) list_of_df.append(x) except ValueError: continue # 现在用相对路径保存就正常了 for a, b in enumerate(list_of_df ): b.to_csv('Data\\Random\\dataframe{}.csv'.format(a))
方案2:切换目录后及时恢复初始目录
如果一定要用os.chdir(),记得在每次循环后切回脚本启动时的初始目录,避免影响后续逻辑:
import os import pandas as pd # 先保存脚本启动时的初始工作目录 initial_dir = os.getcwd() check = "Data\\" def my_function(directory): return allvars; directories = [os.path.abspath(x[0]) for x in os.walk(check)] directories.remove(os.path.abspath(check)) list_of_df = [] for i in directories: try: os.chdir(i) x = my_function(i) list_of_df.append(x) # 切回初始目录 os.chdir(initial_dir) except ValueError: # 即使出现异常,也要切回初始目录,防止后续逻辑出错 os.chdir(initial_dir) continue # 现在相对路径保存正常 for a, b in enumerate(list_of_df ): b.to_csv('Data\\Random\\dataframe{}.csv'.format(a))
方案3:把相对路径转成基于初始目录的绝对路径
提前获取初始目录,将你要保存的相对路径拼接成绝对路径,这样不管当前工作目录怎么变都能正确找到目标:
import os import pandas as pd # 获取脚本启动时的初始目录 initial_dir = os.getcwd() # 把保存用的相对路径转成绝对路径 save_target_dir = os.path.join(initial_dir, 'Data\\Random') # 确保目标目录存在(如果不存在就创建,避免目录不存在的报错) os.makedirs(save_target_dir, exist_ok=True) check = "Data\\" def my_function(directory): return allvars; directories = [os.path.abspath(x[0]) for x in os.walk(check)] directories.remove(os.path.abspath(check)) list_of_df = [] for i in directories: try: os.chdir(i) x = my_function(i) list_of_df.append(x) except ValueError: continue # 用拼接好的绝对路径保存文件 for a, b in enumerate(list_of_df ): b.to_csv(os.path.join(save_target_dir, f'dataframe{a}.csv'))
小提示
建议平时用os.path.join()来拼接路径,它会自动适配Windows和Linux的路径分隔符,比手动写\\更稳妥,也能减少跨平台的问题。
内容的提问来源于stack exchange,提问作者WDS




