Hoe een bestandsnaam uit een URL te halen & er een woord aan toevoegen?

Ik heb de volgende url:

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

Ik wil graag de bestandsnaam extraheren in deze url: 09-09-201315-47-571378756077.jpg

Zodra ik deze bestandsnaam heb, ga ik deze met deze naam op het bureaublad opslaan.

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

Hierna ga ik het formaat van de foto wijzigen, zodra dat is gebeurd, sla ik de gewijzigde versie op en voeg ik het woord “_small” toe aan het einde van de bestandsnaam.

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))

Hiervan probeer ik twee bestanden te krijgen, de originele foto met de originele naam en vervolgens de aangepaste foto met de gewijzigde naam. Vind ik leuk:

09-09-201315-47-571378756077.jpg

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

Hoe kan ik dit doen?


Antwoord 1, autoriteit 100%

U kunt urllib.parse.urlparsemet 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

Antwoord 2, autoriteit 16%

os.path.basename(url)

Waarom je best doen?

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'

Opmerking 20-12-2020

Niemand heeft tot nu toe een complete oplossing geboden.

Een URL kan een ?[query-string]en/of een #[fragment Identifier]bevatten (maar alleen in die volgorde: 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'

Antwoord 3, autoriteit 11%

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

gebruik misschien “.jpg” in het laatste geval sinds een . kan ook in de bestandsnaam staan.


Antwoord 4, autoriteit 6%

Je kunt de url gewoon splitsen door “/” en het laatste lid van de lijst ophalen:

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

Gebruik vervolgens replaceom het einde te wijzigen:

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

Antwoord 5, autoriteit 4%

Gebruik urllib.parse.urlparseom alleen het padgedeelte van de URL te krijgen, en gebruik vervolgens pathlib.Pathop dat pad om de bestandsnaam te krijgen:

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'

Antwoord 6, autoriteit 3%

Met python3 (vanaf 3.4) kun je misbruik maken van de pathlibbibliotheek op de volgende manier:

from pathlib import Path
p = Path('http://example.com/somefile.html')
print(p.name)
# >>> 'somefile.html'
print(p.stem)
# >>> 'somefile'
print(p.suffix)
# >>> '.html'
print(f'{p.stem}-spamspam{p.suffix}')
# >>> 'somefile-spamspam.html'

Antwoord 7

Soms is er een vraagtekenreeks:

filename = url.split("/")[-1].split("?")[0] 
new_filename = filename.replace(".jpg", "_small.jpg")

Antwoord 8

Een eenvoudige versie die het pakket osgebruikt:

import os
def get_url_file_name(url):
    url = url.split("#")[0]
    url = url.split("?")[0]
    return os.path.basename(url)

Voorbeelden:

print(get_url_file_name("example.com/myfile.tar.gz"))  # 'myfile.tar.gz'
print(get_url_file_name("example.com/"))  # ''
print(get_url_file_name("https://example.com/"))  # ''
print(get_url_file_name("https://example.com/hello.zip"))  # 'hello.zip'
print(get_url_file_name("https://example.com/args.tar.gz?c=d#e"))  # 'args.tar.gz'

Antwoord 9

Soms kan de link die je hebt omleidingen hebben (dat was bij mij het geval). In dat geval moet je de omleidingen oplossen

import requests
url = "http://photographs.500px.com/kyle/09-09-201315-47-571378756077.jpg"
response = requests.head(url)
url = response.url

dan kun je doorgaan met het beste antwoord op dit moment (Ofir’s)

import os
from urllib.parse import urlparse
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

het werkt echter niet met deze pagina, omdat de pagina niet meer beschikbaar is


Antwoord 10

Python split-url om de naam en extensie van de afbeelding te vinden

helpt u bij het extraheren van de afbeeldingsnaam. om naam toe te voegen:

imageName =  '09-09-201315-47-571378756077'
new_name = '{0}_small.jpg'.format(imageName) 

Other episodes