Подтвердить что ты не робот

Преобразовать имя файла в файл://URL

В публичном API WeasyPrints я принимаю имена файлов (среди других типов) для входов HTML. Любое имя файла, которое работает со встроенным open(), должно работать, но мне нужно преобразовать его в URL-адрес в схеме file://, который позже будет передан в 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)

UTF-8, по-видимому, рекомендуется RFC 3987 (IRI). Но в этом случае (URL-адрес предназначен для urllib, в конце концов), возможно, мне следует использовать sys.getfilesystemencoding()?

Однако, основываясь на литературе, я должен добавить не только file:, но и file://... за исключением случаев, когда я не должен: В Windows результаты от nturl2path.pathname2url() уже начинается с трех косых черт.

Итак, вопрос: есть ли лучший способ сделать это и сделать его кросс-платформенным?

4b9b3361

Ответ 1

Для полноты в Python 3.4+ вы должны:

import pathlib

pathlib.Path(absolute_path_string).as_uri()

Ответ 2

Я не уверен, что документы достаточно строги, чтобы гарантировать это, но я думаю, что это работает на практике:

import urlparse, urllib

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

Ответ 3

Кредит на комментарий от @danodonovan выше.

Для Python3 будет работать следующий код:

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

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

Ответ 4

Сработает ли для вас следующее?

from urlparse import urlparse, urlunparse

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