在URL中使用os.sep代替"/"可以吗?

3 投票
3 回答
885 浏览
提问于 2025-04-18 14:25

看起来 os.sep 返回的是 "/" 这个符号,我在想能不能用它来构造一个网址,比如想得到像 https://some.domain.com/catalogs 这样的链接。

   protocol + request.get_host() + os.sep + get_file_name() 
  • 这样做会有什么问题吗? 或者
  • 在 urllib/2 里有没有什么方法可以用来连接网址?

3 个回答

3

来自文档的内容:

操作系统用来分隔路径名各部分的字符。在POSIX系统中是'/',而在Windows系统中是'\'。需要注意的是,知道这个字符并不足以让你正确处理路径名的解析或连接——应该使用os.path.split()和os.path.join()来处理这些问题——但有时候知道这个字符还是挺有用的。你也可以通过os.path来获取这个信息。

所以,,这样使用是不安全的。

对于URI的解析、分割、连接等操作,你应该使用urllib.parse库。(在Python 2中叫做urlparse

4

在Windows系统上,os.sep会返回\这个符号。你是否需要这个符号,主要取决于你使用的协议。一般来说,如果你处理的不是file://这种格式的URL,使用os.sep就不太合适了(即使是这种情况,也有点值得怀疑)。

你可能会觉得urlparse这个工具很有用:https://docs.python.org/2/library/urlparse.html

3

os.sep 是用来获取你当前系统文件路径的分隔符。你的系统路径和URI路径是不一样的。

RFC 3986 里说:

一个路径由一系列用斜杠("/")分开的路径段组成。

如果你有一个像 http://foo.bar.baz/a/b/c/d 这样的URI,你应该使用 urlsplit 来把它拆分成不同的部分,并提取出 path 部分。然后你可以安全地使用 .split('/') 来获取这个路径的每个部分,或者用 '/'.join 来根据这些部分重新构建一个路径(前提是你知道每个部分都是有效的)。

这里的语法规定,/ 只能作为路径段的分隔符,想要确认的话可以查一下RFC。不过,这个规则不适用于整个URL,/ 在其他URL部分可能有不同的意思。

urlsplit 的反向操作是 urlunsplit,当你把路径组装好后,它可以帮你完成想要的操作。

为了安全起见,在用 / 连接各个路径部分之前,你应该先对它们进行百分号编码,使用 urllib.quote('/test', '')(注意第二个参数 - 这里 / 默认是不被转义的)。

撰写回答