Why doesn't os.path.join() work in this case?
下面的代码在调试时不会联接,命令不存储整个路径,只存储最后一个条目。
1 | os.path.join('/home/build/test/sandboxes/', todaystr, '/new_sandbox/') |
当我测试它时,它只存储代码的
后一个字符串不应以斜线开头。如果它们以斜线开始,那么它们被认为是"绝对路径",在它们被丢弃之前的一切都被丢弃。
引用
If a component is an absolute path, all previous components are thrown away and joining continues from the absolute path component.
注意:在Windows中,与驱动器号相关的行为,与早期的python版本相比似乎有所改变:
On Windows, the drive letter is not reset when an absolute path component (e.g.,
r'\foo' ) is encountered. If a component contains a drive letter, all previous components are thrown away and the drive letter is reset. Note that since there is a current directory for each drive,os.path.join("c:","foo") represents a path relative to the current directory on driveC: (c:foo ), notc:\foo .
即使是一个斜线也会毁了它。
因此,只有在与类似的参考点一起使用时才有意义
1 | os.path.join(os.path.sep, 'home','build','test','sandboxes',todaystr,'new_sandbox') |
不要在路径组件的开头使用正斜杠,除非引用根目录:
1 | os.path.join('/home/build/test/sandboxes', todaystr, 'new_sandbox') |
另请参见:http://docs.python.org/library/os.path.html os.path.join
为了帮助理解为什么这种令人惊讶的行为并不完全糟糕,考虑一个接受配置文件名作为参数的应用程序:
1 2 | config_root ="/etc/myapp.conf/" file_name = os.path.join(config_root, sys.argv[1]) |
如果应用程序是用以下方式执行的:
1 | $ myapp foo.conf |
将使用配置文件
但是考虑一下如果用以下方法调用应用程序会发生什么:
1 | $ myapp /some/path/bar.conf |
那么,
这可能不太好,但我相信这是绝对路径行为的动机。
这是因为您的
要使您的功能更易于移植,请按如下方式使用:
1 | os.path.join(os.sep, 'home', 'build', 'test', 'sandboxes', todaystr, 'new_sandbox') |
或
1 | os.path.join(os.environ.get("HOME"), 'test', 'sandboxes', todaystr, 'new_sandbox') |
对于具有现有联接的字符串,尝试使用
1 2 3 4 5 6 7 | import os home = '/home/build/test/sandboxes/' todaystr = '042118' new = '/new_sandbox/' os.path.join(*home.split("/"), todaystr, *new.split("/")) |
它是如何工作的…
列表前的
仅使用
1 | os.path.join('/home/build/test/sandboxes/', todaystr, 'new_sandbox') |
像这样做,不要太多的斜杠
1 2 | root="/home" os.path.join(root,"build","test","sandboxes",todaystr,"new_sandbox") |
请注意,如果您使用
1 2 3 4 | components = os.path.splitext(filename) prefix = components[0] extension = components[1] return os.path.join("avatars", instance.username, prefix, extension) |
尽管
1 | return os.path.join("avatars", instance.username, prefix) + extension |