将文件名转换为file:// URL

时间:2012-07-27 12:08:19

标签: python url filenames

在WeasyPrint的公共API中,我接受HTML输入的文件名(以及其他类型)。任何与内置open()一起使用的文件名都可以使用,但我需要将其转换为file://方案中的网址,该网址稍后会传递给urllib.urlopen()

(内部的所有内容都是URL格式。我需要为文档提供“基本网址”,以便使用urlparse.urljoin()解析相对网址引用。)

urllib.pathname2url是一个开始:

  

将路径名路径从路径的本地语法转换为URL路径组件中使用的表单。 这不会生成完整的网址。已使用quote()函数引用返回值。

重点是我的,但我确实需要一个完整的URL。到目前为止,这似乎有效:

def path2url(path):
    """Return file:// URL from a filename."""
    path = os.path.abspath(path)
    if isinstance(path, unicode):
        path = path.encode('utf8')
    return 'file:' + urlparse.pathname2url(path)

RFC 3987 (IRI)似乎推荐使用UTF-8。但在这种情况下(URL最终用于urllib)也许我应该使用sys.getfilesystemencoding()

但是,根据the literature我不应该只添加file:而是file:// ...除非我不应该:在Windows上nturl2path.pathname2url()的结果已经开始三条斜线。

所以问题是:有没有更好的方法来实现这一目标并使其跨平台?

4 个答案:

答案 0 :(得分:45)

为了完整起见,在Python 3.4+中,你应该这样做:

import pathlib

pathlib.Path(absolute_path_string).as_uri()

答案 1 :(得分:33)

我不确定文档是否足以保证它,但我认为这在实践中有效:

import urlparse, urllib

def path2url(path):
    return urlparse.urljoin(
      'file:', urllib.pathname2url(path))

答案 2 :(得分:2)

感谢上述@danodonovan发表评论。

对于Python3,以下代码将起作用:

from urllib.parse import urljoin
from urllib.request import pathname2url

def path2url(path):
    return urljoin('file:', pathname2url(path))

答案 3 :(得分:0)

以下是否适用于您?

from urlparse import urlparse, urlunparse

urlunparse(urlparse('yourURL')._replace(scheme='file'))