Pandas DataFrame.to_csv 报错 IOError: No such file or directory

85

你好:我正在尝试使用 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方法不能自动创建文件,这正是我希望它能做到的。

7个回答

137
< p > 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)

如果您需要经常执行此操作,这可以轻松地封装为一个函数。


17
os.mkdir 只创建一个直接的目录。如果路径中存在多层不存在的目录,请使用 os.makedirs。但是请注意,如果叶子节点已经存在,则会抛出一个 OSError - mz8i
8
如果现有的叶子目录可以接受,可以使用exist_ok=True调用os.makedirs以避免错误。 - stiaan

67

这里有一种使用优秀的标准库 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 表示如果目录已经存在,则不会引发错误,因此您不必明确检查该目录是否存在。


1
这就是所需的内容,我也考虑过使用上述实现递归地创建目录。但这种方法更好、更简单。 - Janith
5
pathlib 简直是太棒了!:D - Tim
7
你可以使用os.makedirs('long_path/to/my_dir', exist_ok=True)完成完全相同的操作-具有完全相同的行为。但如果你喜欢面向对象的方法,pathlib也是没有问题的选择! - qRTPCR
1
说实话,这部分只是为了向人们介绍pathlib而已。作为一个英国人,我必须承认它非常适合我!☕ - Tim
这应该是被接受的答案。更加简洁和安全的解决方案。 - Crispy Holiday

3

当我把file://误加在保存路径开头时,我遇到了这个错误。既然搜索结果将我带到了这里,可能对其他人也有帮助。


2
傻瓜!pd.read_csv没有file://前缀的问题,但是不知道为什么to_csv会有问题。 - kmiller96

0

Tim的答案上进行补充,如果你有整个文件路径在一个字符串中,可以使用这个修改版:

from pathlib import Path

output_file = '/tmp/long_path/to/my_dir/my_file.csv'
output_file_path = Path(output_file)

output_file_path.parent.mkdir(parents=True, exist_ok=True)

df.to_csv(output_file)

通过在Path()中使用文件的完整路径,它将指向该文件,因此我们需要在调用.mkdir之前调用.parent,以免创建一个与我们的文件同名的目录。

0
在我的情况下,这是一个权限问题。我的操作系统是Windows。我安装了一个杀毒软件,并且之前将该目录设置为受保护状态。我完全忘记了这一点。在禁用它之后,一切正常运行。所以,当你遇到类似问题时,请检查一下目录是否受保护。

0
我有同样的问题,但只针对一个文件名。我在同一个文件夹中保存了很多不同名称的文件。如果我更改这个文件名,就会保存文件。
我有一个问题,操作系统库有一些保留字符吗?
当我在任何文件夹中保存"PRN.csv"时,会出现错误,如果我将文件名更改为"PRN5.csv",则可以无错误保存。

哇!当我在Windows手动创建这个文件时,出现了系统错误。所以这是一个涉及一些名称的操作系统错误。 - undefined
这并没有真正回答问题。如果你有其他问题,你可以点击提问来提问。如果你想在这个问题有新的回答时收到通知,你可以关注这个问题。一旦你有足够的声望,你也可以添加悬赏来吸引更多的关注。- 来自评论 - undefined

-3

将 Jupyter 中的 'csv' 文件保存到桌面:

df.to_csv(r'your directory\your file name.csv', index=False)

例如:

df5.to_csv(r'C:\Users\Asus\Desktop\DataSets\compounds\inactive_compounds.csv', index=False) 

我从一天到另一天遇到了同样的问题。虽然它之前对我起作用,但不幸的是现在无法使用:df.to_csv(r'你的目录\你的文件名.csv', index=False) - Steve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接