You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用相对路径保存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

火山引擎 最新活动