os.path.join('/home/build/test/sandboxes/', todaystr, '/new_sandbox/')
当我测试时,它只存储了代码中的/new_sandbox/
部分。
后面那些字符串不应该以斜杠开头。如果它们以斜杠开头,那么它们将被视为“绝对路径”,并且在它们之前的所有内容都将被丢弃。
引用Python文档中os.path.join
的说明:
如果组成部分是绝对路径,则所有先前的组成部分都被丢弃,并且从绝对路径组成部分继续连接。
注意在Windows上,与早期的Python版本相比似乎已经更改了驱动器字母的行为:
在Windows上,当遇到绝对路径组件(例如
r'\foo'
)时,驱动器字母不会重置。如果组件包含驱动器字母,则所有先前的组件都被丢弃,驱动器字母被重置。请注意,由于每个驱动器都有当前目录,因此os.path.join("c:", "foo")
表示相对于驱动器C上的当前目录的路径(c:foo
),而不是c:\foo
。
os.path.join()
的思想是使您的程序跨平台(linux/windows等)。
即使是一个斜杠也会破坏它。
因此,只有在使用某种参考点(如os.environ['HOME']
或os.path.dirname(__file__)
)时才有意义。
os.path.join()
可以与os.path.sep
结合使用,创建绝对路径而不是相对路径。
os.path.join(os.path.sep, 'home','build','test','sandboxes',todaystr,'new_sandbox')
os.path.sep
比其他任何答案都更好!使用os.path
而不是基本字符串方法的整个要点是避免写入斜杠/
。将每个子目录作为一个新参数,并删除所有斜杠也很好。最好进行检查以确保 todaystr
不以斜杆开头! ;) - snooze92os.path.join('/home/build/test/sandboxes', todaystr, 'new_sandbox')
另请参阅:http://docs.python.org/library/os.path.html#os.path.join
为了帮助理解为什么这种令人惊讶的行为并不完全糟糕,请考虑一个接受配置文件名作为参数的应用程序:
config_root = "/etc/myapp.conf/"
file_name = os.path.join(config_root, sys.argv[1])
如果应用程序使用以下方式执行:
$ myapp foo.conf
将使用配置文件/etc/myapp.conf/foo.conf
。
但是请考虑如果应用程序以以下方式调用会发生什么:
$ myapp /some/path/bar.conf
那么,myapp
应该使用位于/some/path/bar.conf
的配置文件(而不是类似于/etc/myapp.conf/some/path/bar.conf
之类的路径)。
也许这不是最好的方法,但我相信这就是绝对路径行为的动机所在。
sys.argv
输入来确定是否要在前面添加 config_root
。所有的 os.path.join
应该关心的只是连接文件路径元素。 - user5359531os.path.join(p1,p2)
的功能并不是真正地连接p1
和p2
,而是将p2
相对于p1
(如果p2
是绝对路径,则是绝对路径)。 - Nephanth尝试使用split("/")
和*
的组合处理已存在分隔符的字符串。
import os
home = '/home/build/test/sandboxes/'
todaystr = '042118'
new = '/new_sandbox/'
os.path.join(*home.split("/"), todaystr, *new.split("/"))
工作原理...
split("/")
将现有路径转换为列表:['', 'home', 'build', 'test', 'sandboxes', '']
列表前面的*
将列表中的每个项目分解出来成为它自己的参数。
这是因为您的路径'/new_sandbox/'
以/
开头,因此被认为是相对于根目录的路径。请删除前面的/
。
os.path.join(os.sep, 'home', 'build', 'test', 'sandboxes', todaystr, 'new_sandbox')
或者
os.path.join(os.environ.get("HOME"), 'test', 'sandboxes', todaystr, 'new_sandbox')
像这样做,不要使用过多的斜杠
root="/home"
os.path.join(root,"build","test","sandboxes",todaystr,"new_sandbox")
os.sep
代替/
- Kots仅使用new_sandbox
尝试
os.path.join('/home/build/test/sandboxes/', todaystr, 'new_sandbox')
os.path.normpath
来实现这个目标。 - Gareth Latty