web-dev-qa-db-ja.com

ファイル名をfile:// URLに変換します

WeasyPrintのパブリックAPIでは、HTML入力にファイル名(他のタイプも含む)を受け入れます。組み込みのopen()で機能するファイル名はすべて機能するはずですが、後でurllib.urlopen()に渡される_file://_スキームのURLに変換する必要があります。

(すべては内部的にURL形式です。urlparse.urljoin()を使用して相対URL参照を解決するには、ドキュメントの「ベースURL」が必要です。)

rllib.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)
_

UTF-8は RFC 3987(IRI) で推奨されているようです。しかし、この場合(URLは最終的にurllibを意味します)多分 sys.getfilesystemencoding()

ただし、 文献 に基づいて、_file:_だけでなく_file://_を先頭に追加する必要があります:Windowsでは、nturl2path.pathname2url()からの結果は既に開始3つのスラッシュがあります。

質問は次のとおりです。これを実行し、クロスプラットフォームにするより良い方法はありますか?

38
Simon Sapin

完全を期すために、Python 3.4+では、次のようにする必要があります。

import pathlib

pathlib.Path(absolute_path_string).as_uri()
51
ToBeReplaced

ドキュメントがそれを保証するほど厳密であるかどうかはわかりませんが、これは実際に機能すると思います:

import urlparse, urllib

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

上記の@danodonovanからコメントしてください。

Python3の場合、次のコードが機能します。

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

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

以下はあなたのために働きますか?

from urlparse import urlparse, urlunparse

urlunparse(urlparse('yourURL')._replace(scheme='file'))
0
Jon Clements