Pandas DataFrame.to_csv 引发 IOError:没有这样的文件或目录

Posted

技术标签:

【中文标题】Pandas DataFrame.to_csv 引发 IOError:没有这样的文件或目录【英文标题】:Pandas DataFrame.to_csv raising IOError: No such file or directory 【发布时间】: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 方法是否应该能够创建文件?这就是我打算让它做的事情。

【问题讨论】:

【参考方案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 有问题。

以上是关于Pandas DataFrame.to_csv 引发 IOError:没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

pandas一些常用函数的使用和理解

pandas.DataFrame.to_csv:按列选择性地应用 date_format

Pandas DataFrame.to_csv() 不输出所有列

Pandas DataFrame.to_csv 引发 IOError:没有这样的文件或目录

使用 Pandas Excelwriter 写入 StringIO 对象?

5种常用格式的数据输出,手把手教你用Pandas实现