Download-Skript von Python 2 auf Python 3 portieren

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__deets__: So wie ich es jetzt verstanden habe, wird ein Pfad zur URL, wenn er mehr als Verzeichnisnamen und Dateinamen enthält.

Gruß
Atalanttore
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Naja. Finde ich eine komische Sichtweise. Pfade und URLs haben Überlappungen. Aber das eine ist keine untermenge des anderen. Zb gibt es AFAIK kein Verzeichnis hoch in URLs
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__deets__: Mit "Verzeichnis hoch" meinst du den Befehl oder etwas anderes?


Nach weiterer Suche bin ich nun auf eine Funktion zur Extraktion des Dateinamens aus einer URL gestoßen.

Ich habe den Code der Funktion auf das Wesentliche gekürzt:

Code: Alles auswählen

def url2filename(url):
    """
    Return basename corresponding to url.
    Based on https://gist.github.com/zed/c2168b9c52b032b5fb7d
    """

    url_path = urllib.parse.urlsplit(url).path
    basename = posixpath.basename(urllib.parse.unquote(url_path))

    if (os.path.basename(basename) != basename or urllib.parse.unquote(posixpath.basename(url_path)) != basename):
        raise ValueError  # reject '%2f' or 'dir%5Cbasename.ext' on Windows
    return basename
Ist diese Funktion ein besserer Ansatz als nur `os.path.basename()` dafür zu verwenden?

Gruß
Atalanttore
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Ich meine “../../..”. Das sind immer Pfade. In der Funktion ist mir zu oft unquote aufgerufen, mach das EINMAL am Anfang. Und da man weiß, das URLs den / zur Trennung der Komponenten nutzen, würde ich auch das als simples split Argument benutzten. Da posixpath zu nutzen nur weil das zufällig den gleichen Trenner hat ist nicht wirklich besser als das os.path Modul.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__deets__: Ich habe den Code nach deinen Empfehlungen, sofern ich alles richtig verstanden habe, und noch ein wenig mehr umgebaut. Auf reguläre Ausdrücke habe ich verzichtet.

Code:

Code: Alles auswählen

import fnmatch
import urllib.parse

URL = "https://apod.nasa.gov/image/1906/gendlerM83-New-HST-ESO-LL.jpg"


def get_basename(url, file_extension):
    """Return basename corresponding to url."""

    url_path = urllib.parse.urlsplit(url).path
    unquoted_url= urllib.parse.unquote(url_path)
    basename = unquoted_url.split("/")[-1]

    if not fnmatch.fnmatch(basename, f"*.{file_extension}"):
        raise ValueError

    return basename


print(get_basename(URL, 'jpg'))

Gruß
Atalanttore
Antworten