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

Sim*_*pin 38 python url filenames

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

(一切都在内部的URL形式.我需要有一个文档的"基本URL",以解决相关的URL引用urlparse.urljoin().)

urllib.pathname2url是一个开始:

将路径名路径从路径的本地语法转换为URL路径组件中使用的表单.这不会产生完整的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)
Run Code Online (Sandbox Code Playgroud)

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

然而,根据文献,我应该在前面加上不仅仅是file:但是file://......除非我不应该:在Windows上从结果nturl2path.pathname2url()已经以三条斜线开始.

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

ToB*_*ced 52

为了完整起见,在Python 3.4+中,您应该:

import pathlib

pathlib.Path(absolute_path_string).as_uri()
Run Code Online (Sandbox Code Playgroud)

  • 此模块也在PyPI上(对于其他Python版本)https://pypi.python.org/pypi/pathlib/ (5认同)

Dav*_*ams 33

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

import urlparse, urllib

def path2url(path):
    return urlparse.urljoin(
      'file:', urllib.pathname2url(path))
Run Code Online (Sandbox Code Playgroud)

  • 在py3k中,这将成为`import urlib.parse as urlparse`和`import urlib.request as urllib` (6认同)
  • 在Linux,Windows和OS X上进行了测试,它在所有这三个方面都运行良好. (3认同)
  • 如果您使用[six](https://pythonhosted.org/six/)库来确保Python 2和3的可移植性:`return six.moves.urllib_parse.urljoin("file://",six.moves.urllib .request.pathname2url(路径))` (2认同)

kev*_*rpe 5

感谢@danodonovan上面的评论。

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

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

def path2url(path):
    return urljoin('file:', pathname2url(path))
Run Code Online (Sandbox Code Playgroud)