Seite 1 von 1

Python: Liste sortierter Dateinamen

Verfasst: Sa, 20.02.2016 19:13
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

Re: Python: Liste sortierter Dateinamen

Verfasst: Sa, 20.02.2016 21:08
von komma4
warum nicht sorted

Re: Python: Liste sortierter Dateinamen

Verfasst: Sa, 20.02.2016 22:07
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

Re: Python: Liste sortierter Dateinamen

Verfasst: Sa, 20.02.2016 23:13
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]))

Re: Python: Liste sortierter Dateinamen

Verfasst: So, 21.02.2016 00:35
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

Re: Python: Liste sortierter Dateinamen

Verfasst: So, 21.02.2016 14:37
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 )    

Re: Python: Liste sortierter Dateinamen

Verfasst: So, 21.02.2016 15:15
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