os.makedirs不理解我的路径中的“~”

223

我的路径中有一个小问题,与~有关。

这段代码示例创建了一些名为~/some_dir的目录,但它没有理解我想在我的主目录下创建some_dir

my_dir = "~/some_dir"
if not os.path.exists(my_dir):
    os.makedirs(my_dir)

请注意,这是在基于Linux的系统上。

3个回答

375
你需要手动扩展波浪线:
my_dir = os.path.expanduser('~/some_dir')

3
我没有使用os.path.expanduser,而是像问题提问者一样做了,结果Python在当前目录下创建了一个"~"文件夹。我该如何删除这个文件夹(而不是移除实际的主目录)? - Happy Mittal
4
如果其他人有疑问,你可以使用 ./ 来引用当前目录,因此可以使用 ./~ 来删除当前目录中的文件夹 ~。为了更安全,最简单的方法是提供完整路径:rm -rf path/to/bad/dir/~ - alkasm
1
或者只需用反斜杠转义它:rm \~ - DDMC
为什么要这样做呢?Matlab可以自动完成这个(以及几乎所有其他任务)。 - 123
它返回字符串还是路径对象? - alper

91

~/some_dir 转换为 $HOME/some_dir 的过程称为 tilde expansion,是一种常见的用户界面特性。文件系统不知道这个特性。

在Python中,可以通过os.path.expanduser实现这个功能:

my_dir = os.path.expanduser("~/some_dir")

确实,命名为~的文件或目录是完全有效的。因此,如果可能的话,最好避免使用shell主目录快捷方式,以免产生歧义。 - bobince
8
请注意,即使进行波浪线扩展,也可以在当前目录中访问名为“〜”的文件/目录,使用“./〜”符号表示。这是有效的,因为〜扩展仅在文件名开头发生。这也是一种方便的技巧,用于处理以“-”或其他被命令行界面特殊处理的字符开头的文件名。你可能能猜到我肯定做了太多的 shell 脚本黑客工作。 - ddaa
文件系统对此一无所知。 - Bin
谢谢你的回答。但是在用户的主目录中,更符合Python风格(且与平台无关)的路径语法约定是什么?是使用$HOME/some_dir而不是像你的示例中使用波浪线吗? - undefined

17

这可能是因为Python不同于Bash,不遵循相同的惯例。您可以使用以下代码:

homedir = os.path.expanduser('~')

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