下面的代码将不会连接,在调试时,命令不存储整个路径,而只存储最后一个条目。
os.path.join('/home/build/test/sandboxes/', todaystr, '/new_sandbox/')
当我测试这个时,它只存储/new_sandbox/部分的代码。
下面的代码将不会连接,在调试时,命令不存储整个路径,而只存储最后一个条目。
os.path.join('/home/build/test/sandboxes/', todaystr, '/new_sandbox/')
当我测试这个时,它只存储/new_sandbox/部分的代码。
当前回答
请注意,如果使用os.path.join()来包含一个已经包含一个点的扩展,就会出现类似的问题,这是在使用os.path.splitext()时自动发生的情况。在这个例子中:
components = os.path.splitext(filename)
prefix = components[0]
extension = components[1]
return os.path.join("avatars", instance.username, prefix, extension)
即使扩展名可能是。jpg,你最终会得到一个名为“foobar”的文件夹,而不是一个名为“foobar.jpg”的文件。为了防止这种情况,你需要单独追加扩展:
return os.path.join("avatars", instance.username, prefix) + extension
其他回答
你可以去掉'/':
>>> os.path.join('/home/build/test/sandboxes/', todaystr, '/new_sandbox/'.strip('/'))
'/home/build/test/sandboxes/04122019/new_sandbox'
为了帮助理解为什么这种令人惊讶的行为并不完全可怕,考虑一个接受配置文件名作为参数的应用程序:
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或类似文件)。
这可能不是很好,但我相信这是绝对路径行为的动机。
我建议从第二个和下面的字符串中剥离字符串os.path。Sep,防止它们被解释为绝对路径:
first_path_str = '/home/build/test/sandboxes/'
original_other_path_to_append_ls = [todaystr, '/new_sandbox/']
other_path_to_append_ls = [
i_path.strip(os.path.sep) for i_path in original_other_path_to_append_ls
]
output_path = os.path.join(first_path_str, *other_path_to_append_ls)
os.path.join("a", *"/b".split(os.sep))
'a/b'
更完整的版本:
import os
def join (p, f, sep = os.sep):
f = os.path.normpath(f)
if p == "":
return (f);
else:
p = os.path.normpath(p)
return (os.path.join(p, *f.split(os.sep)))
def test (p, f, sep = os.sep):
print("os.path.join({}, {}) => {}".format(p, f, os.path.join(p, f)))
print(" join({}, {}) => {}".format(p, f, join(p, f, sep)))
if __name__ == "__main__":
# /a/b/c for all
test("\\a\\b", "\\c", "\\") # optionally pass in the sep you are using locally
test("/a/b", "/c", "/")
test("/a/b", "c")
test("/a/b/", "c")
test("", "/c")
test("", "c")
像这样,去掉多余的斜杠
root="/home"
os.path.join(root,"build","test","sandboxes",todaystr,"new_sandbox")