web-dev-qa-db-fra.com

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 la fonction open() intégrée devrait fonctionner, mais je dois le convertir en une URL dans le schéma file:// Qui sera ensuite transmise à urllib.urlopen() .

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

rllib.pathname2url est un début:

Convertissez le chemin d'accès à partir de la syntaxe locale d'un chemin d'accès au format utilisé dans le composant de chemin d'accès d'une URL. Cela ne produit pas une URL complète. La valeur de retour sera déjà citée à l'aide de 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), je devrais peut-être utiliser sys.getfilesystemencoding () ?

Cependant, basé sur 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() commence déjà par trois barres obliques.

La question est donc la suivante: existe-t-il une meilleure façon de procéder et de la multiplier?

38
Simon Sapin

Pour être complet, dans Python 3.4+, vous devez faire:

import pathlib

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

Je ne suis pas sûr que les documents soient suffisamment 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))
33
Dave Abrahams

Crédit pour le commentaire de @danodonovan au 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))
3
kevinarpe

Les éléments suivants fonctionnent-ils pour vous?

from urlparse import urlparse, urlunparse

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