82 votes

Comment extraire un nom de fichier d'une URL et y ajouter un mot ?

J'ai l'url suivante :

url = http://photographs.500px.com/kyle/09-09-201315-47-571378756077.jpg

Je voudrais extraire le nom du fichier dans cette url : 09-09-201315-47-571378756077.jpg

Une fois que j'ai obtenu ce nom de fichier, je vais l'enregistrer sous ce nom sur le Bureau.

filename = **extracted file name from the url**     
download_photo = urllib.urlretrieve(url, "/home/ubuntu/Desktop/%s.jpg" % (filename))

Ensuite, je vais redimensionner la photo, une fois que c'est fait, je vais enregistrer la version redimensionnée et ajouter le mot "_small" à la fin du nom du fichier.

downloadedphoto = Image.open("/home/ubuntu/Desktop/%s.jpg" % (filename))               
resize_downloadedphoto = downloadedphoto.resize.((300, 300), Image.ANTIALIAS)
resize_downloadedphoto.save("/home/ubuntu/Desktop/%s.jpg" % (filename + _small))

À partir de là, j'essaie d'obtenir deux fichiers, la photo originale avec le nom original, puis la photo redimensionnée avec le nom modifié. Par exemple :

09-09-201315-47-571378756077.jpg

09-09-201315-47-571378756077_small.jpg

Comment puis-je procéder ?

213voto

Ofir Israel Points 3545

Vous pouvez utiliser urllib.parse.urlparse con os.path.basename :

import os
from urllib.parse import urlparse

url = "http://photographs.500px.com/kyle/09-09-201315-47-571378756077.jpg"
a = urlparse(url)
print(a.path)                    # Output: /kyle/09-09-201315-47-571378756077.jpg
print(os.path.basename(a.path))  # Output: 09-09-201315-47-571378756077.jpg

Votre URL peut contenir codé en pourcentage des caractères comme %20 pour l'espace ou %E7%89%B9%E8%89%B2 pour "". Si c'est le cas, vous devrez unquote (ou unquote_plus ) les. Vous pouvez également utiliser pathlib.Path().name au lieu de os.path.basename ce qui pourrait permettre d'ajouter un suffixe au nom (comme demandé dans la question initiale) :

from pathlib import Path
from urllib.parse import urlparse, unquote

url = "http://photographs.500px.com/kyle/09-09-2013%20-%2015-47-571378756077.jpg"
urlparse(url).path

url_parsed = urlparse(url)
print(unquote(url_parsed.path))  # Output: /kyle/09-09-2013 - 15-47-571378756077.jpg
file_path = Path("/home/ubuntu/Desktop/") / unquote(Path(url_parsed.path).name)
print(file_path)        # Output: /home/ubuntu/Desktop/09-09-2013 - 15-47-571378756077.jpg

new_file = file_path.with_stem(file_path.stem + "_small")
print(new_file)         # Output: /home/ubuntu/Desktop/09-09-2013 - 15-47-571378756077_small.jpg

Une autre solution consiste à utiliser unquote(urlparse(url).path.split("/")[-1]) .

31voto

P i Points 6466

os.path.basename(url)

Pourquoi faire plus d'efforts ?

In [1]: os.path.basename("https://example.com/file.html")
Out[1]: 'file.html'

In [2]: os.path.basename("https://example.com/file")
Out[2]: 'file'

In [3]: os.path.basename("https://example.com/")
Out[3]: ''

In [4]: os.path.basename("https://example.com")
Out[4]: 'example.com'

Note 2020-12-20

Jusqu'à présent, personne n'a apporté de solution complète.

Un URL peut contenir un ?[query-string] et/ou un #[fragment Identifier] (mais seulement dans cet ordre) : ref )

In [1]: from os import path

In [2]: def get_filename(url):
   ...:     fragment_removed = url.split("#")[0]  # keep to left of first #
   ...:     query_string_removed = fragment_removed.split("?")[0]
   ...:     scheme_removed = query_string_removed.split("://")[-1].split(":")[-1]
   ...:     if scheme_removed.find("/") == -1:
   ...:         return ""
   ...:     return path.basename(scheme_removed)
   ...:

In [3]: get_filename("a.com/b")
Out[3]: 'b'

In [4]: get_filename("a.com/")
Out[4]: ''

In [5]: get_filename("https://a.com/")
Out[5]: ''

In [6]: get_filename("https://a.com/b")
Out[6]: 'b'

In [7]: get_filename("https://a.com/b?c=d#e")
Out[7]: 'b'

22voto

RickyA Points 2985
filename = url[url.rfind("/")+1:]
filename_small = filename.replace(".", "_small.")

utilisez peut-être ".jpg" dans le dernier cas, car le nom de fichier peut également contenir un .

13voto

Bryan Points 1718

Vous pourriez simplement diviser l'url par "/" et récupérer le dernier membre de la liste :

    url = "http://photographs.500px.com/kyle/09-09-201315-47-571378756077.jpg"
    filename = url.split("/")[-1] 
    #09-09-201315-47-571378756077.jpg

Ensuite, utilisez replace pour changer la fin :

    small_jpg = filename.replace(".jpg", "_small.jpg")
    #09-09-201315-47-571378756077_small.jpg

8voto

Boris Points 1440

Utilisation urllib.parse.urlparse pour obtenir uniquement le partie du chemin d'accès de l'URL puis utiliser pathlib.Path sur ce chemin pour obtenir le nom du fichier :

from urllib.parse import urlparse
from pathlib import Path

url = "http://example.com/some/long/path/a_filename.jpg?some_query_params=true&some_more=true#and-an-anchor"
a = urlparse(url)
a.path             # '/some/long/path/a_filename.jpg'
Path(a.path).name  # 'a_filename.jpg'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X