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.urlparse
met 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 replace
om 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.urlparse
om alleen het padgedeelte van de URL te krijgen, en gebruik vervolgens pathlib.Path
op 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 pathlib
bibliotheek 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 os
gebruikt:
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)