Namen und Werte miteinander verknüpfen und sortieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
blutec
User
Beiträge: 16
Registriert: Montag 21. September 2020, 17:05

Hallo zusammen,
ich habe ein Programm geschrieben, dass File-Ordner analysiert. Es ermittelt die Dateiendungen der Files, die in Unterordnern liegen und zählt deren Häufigkeit.
Das kann ich nun ausprinten und es funktioniert ganz gut, wenn man es alphabetisch ausgibt. Allerdings möchte ich jetzt, dass die Liste nach Häufigkeit sortiert ist, nicht alphabetisch.
Zum Sortieren muss ich nun die Liste der Dateiendungen mit deren Häufigkeit verknüpfen, stehe allerdings auf dem Schlauch. Dictionary scheint nicht die Lösung zu sein, Tupel auch nicht.
An einer zweidimensionalen Liste bin ich aber auch gescheitert. Nun stehe ich auf dem Schlauch, denn es muss doch dazu eine einfache Lösung geben. Asl Anfänger benötige ich einen Denkanstoß.

Code: Alles auswählen

#!/usr/bin/env python3

import os

found_suffixes = []
allsuffixes = []
allsubdirs = []

def showdircontent(path):

    for root_dir_path, sub_dirs, files in os.walk(path):

        for sub_dir in sub_dirs:
            allsubdirs.append(sub_dir)

        for file in files:

            suffix = str.upper(file.split('.')[-1])  #Dateiendung ermitteln
            allsuffixes.append(suffix)

            if suffix not in found_suffixes:  #Liste der gefundenen Dateiendungen erstellen
                found_suffixes.append(suffix)

    found_suffixes.sort()
    print(f"{len(found_suffixes)} different file extensions found in {len(allsubdirs)} subdirectories  \n")

    for foundsuffix in found_suffixes:
        print(f"{foundsuffix}: {allsuffixes.count(foundsuffix)}")

if __name__ == '__main__':

    showdircontent("G:/Dokumente")

Ausgabe:

10 different file extensions found in 28 subdirectories

BMP: 2
DOC: 21
DOCX: 20
JPG: 49
PDF: 67
PSD: 1
TXT: 3
XLS: 2
XLSX: 2
ZIP: 4
Benutzeravatar
__blackjack__
User
Beiträge: 13122
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@blutec: Also erst einmal ist das mit `allsuffixes` und `count()` furchtbar ineffizient. Da hätte man schon ein Wörterbuch benutzt, beziehungsweise `collections.Counter`.

Dann gehören auf Modulebene keine Variablen. Und keine davon sollte eine Liste sein. Wie gesagt: `collections.Counter` und für `all_sub_dirs` würde eine Zahl reichen zu der jeweils die Länge von `sub_dirs` addiert wird.

Zum Abtrennen der Dateiendung gibt es in `os.path` eine Funktion, aber eigentlich würde man eher `pathlib` verwenden in neuem Code.

Zeichenkettenmethoden ruft man auf der Zeichenkette auf, nicht auf der Klasse mit einer Zeichenkette als Argument.

Code: Alles auswählen

#!/usr/bin/env python3
from collections import Counter
from pathlib import Path


def show_directory_content(base_path):
    directory_count = 0
    suffix_to_count = Counter()
    for path in base_path.rglob("*"):
        if path.is_dir():
            directory_count += 1
        else:
            suffix_to_count[path.suffix.upper()] += 1

    print(
        f"{len(suffix_to_count)} different file extensions"
        f" found in {directory_count} subdirectories\n"
    )
    for suffix, count in suffix_to_count.most_common():
        print(f"{suffix}: {count}")


if __name__ == '__main__':
    show_directory_content(Path("tmp"))
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten