Python中创建目录时,加不加 '.' 表示相对目录起点,有区别吗?

os.mkdir(’./my-project/scripts/’) 或者用 os.mkdir(os.path.join(’.’, ‘my-project’, ‘scripts’)) 这两种写法,加不加 ‘.’ 都可以执行。

主要用 Py3,加 ‘.’ 和 不加 ‘.’ 表示相对目录起点,有什么区别吗?(印象里 Py2 版本,以前看到有人说不加 ‘.’ 在某些系统上会 OSError?)
Python中创建目录时,加不加 ‘.’ 表示相对目录起点,有区别吗?

7 回复

我猜测要看操作系统怎么处理。


在Python里,创建目录时路径里加不加.开头,在当前目录下操作时通常没有区别,但.代表的是“当前工作目录”,这个起点可能会变。

举个例子,假设你在/home/user/project下运行脚本:

import os

# 情况1:不加点(隐式相对路径)
os.makedirs("data/subfolder", exist_ok=True)
# 这会在 /home/user/project/data/subfolder 创建目录

# 情况2:加点(显式相对路径)
os.makedirs("./data/subfolder", exist_ok=True)
# 这同样会在 /home/user/project/data/subfolder 创建目录

关键区别在于“当前目录”是什么

  • 如果你用os.chdir()改变了工作目录,或者从其他路径调用脚本,.指向的位置就变了。
  • 不加.的路径也是相对于当前目录的,所以本质上和加.效果一样,都是相对路径。

唯一需要注意的情况是当你的路径字符串来自用户输入或拼接时,比如:

base = "./data"
# 如果用户意外输入了类似"../sensitive"的路径,加不加`.`都可能带来安全问题(目录遍历)。

所以,在绝大多数自己写的脚本里,加不加.都一样,看个人或团队编码风格。如果想让路径意图更清晰,或者处理动态路径,可以加上。

总结:在当前目录下操作没区别,但要注意工作目录可能会变。

跟 python 和 3 和创建 和目录都没关系。跟操作系统文件系统 syscall 有关系。

“都可以执行”。。。
一个语句只要没有语法错误,就可以执行,能说明什么?

>>> import os
>>> os.path.join(’.’, ‘my-project’, ‘scripts’)
’./my-project/scripts’
>>> os.path.join(‘my-project’, ‘scripts’)
‘my-project/scripts’

’./my-project/scripts’ 和 ‘my-project/scripts’ 倒是等价。
’./my-project/scripts’ 和 ‘/my-project/scripts’ 意思差远了去了。

建议楼主温习 Linux 基础知识。从前流行《鸟哥的 Linux 私房菜》,不知道现在流行的 Linux 入门书是什么。

谢谢,解释一下,我说 os.mkdir(’./my-project/scripts/’) 加不加 ‘.’ 都可以执行的意思,这里是指加不加 ‘./’。

’/path’ 斜杠打头,没理解错的话,是指绝对根目录吧

windows 按 package 路径优先搜索,而 linux 会优先搜索当前目录。
windows 上,你使用<a target="_blank" href="http://some_script.py" rel="nofollow noopener">some_script.py</a> filename时,这个filename不按照./开头,就会优先查 python 目录的 scripts/底下的filename
linux 下的,见 4L 的说法。

回到顶部