【问题标题】:Pandas DataFrame.to_csv raising IOError: No such file or directoryPandas DataFrame.to_csv 引发 IOError:没有这样的文件或目录
【发布时间】:2018-04-19 00:32:51
【问题描述】:

嗨:我正在尝试使用PandasDataFrame.to_csv 方法将dataframe 保存到csv 文件中:

filename = './dir/name.csv'

df.to_csv(filename)

但是我得到了错误:

IOError: [Errno 2] No such file or directory: './dir/name.csv'

如果文件不存在,to_csv 方法是否应该能够创建文件?这就是我打算让它做的事情。

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    to_csv 确实会创建文件,如果它不存在,如您所说,但它不会创建不存在的目录。确保首先创建了您尝试保存文件的子目录。

    我在工作中经常做这样的事情:

    import os
    
    outname = 'name.csv'
    
    outdir = './dir'
    if not os.path.exists(outdir):
        os.mkdir(outdir)
    
    fullname = os.path.join(outdir, outname)    
    
    df.to_csv(fullname)
    

    如果您需要经常这样做,这可以很容易地封装在一个函数中。

    【讨论】:

    • os.mkdir 只创建一个直接目录。如果路径中有几级目录不存在,请使用os.makedirs。但是请注意,如果叶子存在,它会抛出 OSError
    • @mz8i 如果可以接受现有的叶目录,则可以使用exist_ok=True 调用os.makedirs 以避免错误。
    【解决方案2】:

    这是使用出色的标准库 pathlib 模块的另一种方法,它通常会使事情变得更整洁。

    正如在别处解释的那样,to_csv 将在 文件 不存在时创建它,但 不会 创建任何非文件路径中存在的目录,因此您需要首先确保这些目录存在。

    from pathlib import Path
    
    output_file = 'my_file.csv'
    output_dir = Path('long_path/to/my_dir')
    
    output_dir.mkdir(parents=True, exist_ok=True)
    
    df.to_csv(output_dir / output_file)  # can join path elements with / operator
    

    设置parents=True 也将创建任何必要的父目录,exist_ok=True 意味着如果目录已经存在则不会引发错误,因此您不必单独显式检查。

    【讨论】:

    • 这就是我们想要的,我也想过使用上面的实现递归地创建目录。但这更好也更简单。
    • pathlib 真是个梦想! :D
    • @JKK 你可以用os.makedirs('long_path/to/my_dir', exist_ok=True) 做同样的事情——具有完全相同的行为。但是,如果那是您的一杯茶,那么面向对象的 pathlib 方法没有错!
    • 如果我完全诚实,这部分只是向人们介绍pathlib ? 的机会......是的,作为英国人来说,这非常适合我的一杯茶! ??☕
    • 这应该是公认的答案。更清洁、更安全的解决方案。
    【解决方案3】:

    当我在保存路径的乞求处不小心添加了file:// 时,我遇到了这个错误。由于搜索将我带到这里,可能对某人也有帮助。

    【讨论】:

    • 愚蠢! pd.read_csvfile:// 前缀没有问题,但出于某种原因 to_csv 有问题。
    猜你喜欢
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    相关资源
    最近更新 更多