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?
4 réponses
Pour être complet, en Python 3.4+, vous devriez faire:
import pathlib
pathlib.Path(absolute_path_string).as_uri()
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))
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))
Est-ce que ce qui suit fonctionne pour vous?
from urlparse import urlparse, urlunparse
urlunparse(urlparse('yourURL')._replace(scheme='file'))