Convertir un nom de fichier en Fichier: / / URL

Dans L'API publique de WeasyPrint, j'accepte les noms de fichiers (entre autres types) pour les entrées HTML. Tout nom de fichier qui fonctionne avec le open() intégré devrait fonctionner, mais j'ai besoin de le convertir en une URL dans le schéma file:// qui sera ensuite passé à urllib.urlopen().

(tout est sous forme D'URL en interne. J'ai besoin d'avoir une "URL de base" pour les documents afin de résoudre les références D'URL relatives avec urlparse.urljoin().)

Urllib.pathname2url est un début:

Convertit le chemin d'accès de la syntaxe locale pour un chemin vers le formulaire utilisé dans le composant path D'une URL. cela ne produit pas une URL complète. la valeur de retour sera déjà citée en utilisant la fonction quote ().

L'accent est le mien, mais j'ai besoin d'une URL complète. Jusqu'à présent cela semble fonctionner:

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 semble être recommandé par RFC 3987 (IRI) . Mais dans ce cas (L'URL est destinée à urllib, éventuellement) peut-être que je devrais utiliser sys.getfilesystemencoding () ?

Cependant, sur la base de la littérature je devrais ajouter non seulement file: mais file://... sauf quand je ne devrais pas: sous Windows, les résultats de nturl2path.pathname2url() commencent déjà par trois barres obliques.

, Donc la question est: est-il une meilleure façon de le faire et de le rendre multi-plateforme?

28
demandé sur Simon Sapin 2012-07-27 16:08:18

4 réponses

Pour être complet, en Python 3.4+, vous devriez faire:

import pathlib

pathlib.Path(absolute_path_string).as_uri()
36
répondu ToBeReplaced 2015-08-09 15:43:25

Je ne suis pas sûr que les docs soient assez rigoureux pour le garantir, mais je pense que cela fonctionne dans la pratique:

import urlparse, urllib

def path2url(path):
    return urlparse.urljoin(
      'file:', urllib.pathname2url(path))
32
répondu Dave Abrahams 2013-01-12 21:38:56

Crédit aux commentaires de @danodonovan ci-dessus.

Pour Python3, le code suivant fonctionnera:

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

def path2url(path):
    return urljoin('file:', pathname2url(path))
2
répondu kevinarpe 2016-10-30 02:27:20

Est-ce que ce qui suit fonctionne pour vous?

from urlparse import urlparse, urlunparse

urlunparse(urlparse('yourURL')._replace(scheme='file'))
0
répondu Jon Clements 2012-07-27 12:59:05