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)
Dav*_*ams 33
我不确定文档是否足以保证它,但我认为这在实践中有效:
import urlparse, urllib
def path2url(path):
return urlparse.urljoin(
'file:', urllib.pathname2url(path))
Run Code Online (Sandbox Code Playgroud)
感谢@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)