Python: Liste sortierter Dateinamen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

preklov
***
Beiträge: 76
Registriert: Mo, 29.06.2009 09:04
Wohnort: Ruhrgebiet

Python: Liste sortierter Dateinamen

Beitrag von preklov »

Ich möchte eine Liste von Dateinamen ausgeben, und zwar unabhängig von Groß-/Kleinschreibung sortiert nach den eigentlichen Namen und erst sekundär nach der Erweiterung.

Meine Lösung sieht so aus:

Code: Alles auswählen

def sort_file_names(fileNames, down=False):
    """
    Sortiert eine Liste von Dateinamen alphanumerisch nach Großbuchstaben.
    Sortiert primär die eigentlichen Namen, sekundär die Ergänzungen.
    Gibt eine sortierte Kopie der Liste zurück.
    """
    import os
    if len(fileNames) == 0:
        return []
    maxLen = max([len(os.path.splitext(n)[0]) for n in fileNames])
    # Normiert die Namen linksbündig auf gleiche Länge.
    adjustedNames = [u[0].ljust(maxLen) + u[1]
                     for u in [os.path.splitext(n.upper())
                               for n in fileNames]]
    dictOfNames = {key: value for key, value in zip(adjustedNames, fileNames)}
    return [dictOfNames[key] for key in sorted(adjustedNames, reverse=down)]
Welche bessere Lösung gibt es?

Schöne Grüße
Volker
Schöne Grüße
Volker
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Python: Liste sortierter Dateinamen

Beitrag von komma4 »

warum nicht sorted
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
preklov
***
Beiträge: 76
Registriert: Mo, 29.06.2009 09:04
Wohnort: Ruhrgebiet

Re: Python: Liste sortierter Dateinamen

Beitrag von preklov »

warum nicht sorted
sorted['a.b', 'a b.b'] ergibt ['a b.b', 'a.b'].

Ich will aber nach Namen sortieren, die Ergänzung soll sekundäres Kriterium sein. Das Ergebnis soll also ['a.b', 'a b.b'] sein.

Schöne Grüße
Volker
Schöne Grüße
Volker
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Python: Liste sortierter Dateinamen

Beitrag von komma4 »

dann nimm den Dateiname-Teil als ersten Schlüssel. die Erweiterung als zweiten:

Code: Alles auswählen

sorted(filenames, key=lambda x: (x.split('.')[0], x.split('.')[1]))
edit: falls Punkte im Dateinamen vorkommen (könnten) - nimm'

Code: Alles auswählen

sorted(filenames, key=lambda x: (os.path.splitext(x)[0], os.path.splitext(x)[1]))
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
preklov
***
Beiträge: 76
Registriert: Mo, 29.06.2009 09:04
Wohnort: Ruhrgebiet

Re: Python: Liste sortierter Dateinamen

Beitrag von preklov »

Herzlichen Dank. Das hatte ich aus den sorted-Beispielen so nicht erkannt. Dann reduziert sich mein ganzer Summs auf eine Zeile:

Code: Alles auswählen

return sorted(fileNames, key=lambda x: (os.path.splitext(x)[0].lower(), os.path.splitext(x)[1].lower()), reverse=down)
Schöne Grüße
Volker
Schöne Grüße
Volker
Karolus
********
Beiträge: 7521
Registriert: Mo, 02.01.2006 19:48

Re: Python: Liste sortierter Dateinamen

Beitrag von Karolus »

Hallo

Was steckt hinter `down` ??

IHMO solltest du das so schreiben:

Code: Alles auswählen

return sorted(filenames, key=lambda f: path.splitext(f.lower()) , reverse=True)

bzw. lagere nur die Rückgabe in eine eigene Funktion aus, und verzichte auf das lambda:

Code: Alles auswählen

def sortkrit( p):
    return path.splitext(p.lower())


....

sorted( filenames, key=sortkrit, reverse=True )    
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
preklov
***
Beiträge: 76
Registriert: Mo, 29.06.2009 09:04
Wohnort: Ruhrgebiet

Re: Python: Liste sortierter Dateinamen

Beitrag von preklov »

Was steckt hinter `down` ??
Ein Funktionsparameter (s. OP).
lagere nur die Rückgabe in eine eigene Funktion aus, und verzichte auf das lambda
Klasse. Danke
Schöne Grüße
Volker
Antworten