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 【问题描述】:嗨:我正在尝试使用Pandas
DataFrame.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_csv
对 file://
前缀没有问题,但出于某种原因 to_csv
有问题。以上是关于Pandas DataFrame.to_csv 引发 IOError:没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章
pandas.DataFrame.to_csv:按列选择性地应用 date_format
Pandas DataFrame.to_csv() 不输出所有列
Pandas DataFrame.to_csv 引发 IOError:没有这样的文件或目录