2017-06-12 1 views
0

Sehr geehrte alle ich brauche deine Hilfe. Könntest du so freundlich sein und mir erklären, wann (auf welcher Stufe) ich einen Code schreiben soll, der meine Ordner und Unterordner sortiert?Wo sollte ich eine Sortierfunktion für Ordner und Unterordner in Python-Code anwenden?

Auf den Bildern können Sie meine Ordner & Unterordner Struktur sehen: folderssubfolders.

Ich möchte all meine Ordner und Unterordner einen normalen aufsteigenden Stil für ganze Zahlen haben, '1', '2', ..., '10', '11', ...

dachte ich Legen Sie einen Code zu dem Teil:

zoom_levels = [i for i in sorted(range(zoom_min, zoom + 1), key=int)] 
folders_for_xtiles = [k for k in sorted(range(0, 2 ** zoom), key=int)] 
for zoom_level, folder_for_xtile in itertools.product(zoom_levels, folders_for_xtiles): 
    os.makedirs(os.path.join(path_to_tiles_folder, str(zoom_level), str(folder_for_xtile))) 

aber es hat nicht funktioniert.

Ich dachte dann eine Sortierfunktion zu setzen, wenn ich in meinen Ordner mit einem Code zu graben, aber ich weiß nicht, welche Art von Methoden muß ich von os-Modul anwenden ?:

for zoom_level in range(zoom_min, zoom + 1): 
    xtile_path = os.path.join(path_to_tiles_folder, str(zoom_level)) 
    for xtile_number in range(0, 2 ** zoom): 
     ytile_path = os.path.join(xtile_path, str(xtile_number)) 

Danke Alle

+1

Beobachten Sie nur die Ordner in Ihrer IDE oder haben Sie internen Code, der sie in einer bestimmten Reihenfolge liest? Ich weiß nicht, dass Python irgendetwas tun kann, um die Reihenfolge zu ändern, in der die IDE die Ordner anzeigt (es tut wahrscheinlich seine eigene Sortierung). Sie können die Reihenfolge, in der anderer Code die Dateien liest, kontrollieren (oder nicht). – Blckknght

+0

Vielen Dank für Ihre detaillierten Erklärungen, es kann tatsächlich funktionieren. Ja, ich beobachte solche Reihenfolge meiner Ordner in Pycharm IDE. Vielleicht betrifft es nur die IDE, denn wenn ich diese Struktur über die normale Ordneröffnung in Windows öffne, wird sie sortiert angezeigt. –

Antwort

1

Die meisten Betriebssysteme geben keine starken Garantien über die Reihenfolge, in der Dateien in einem Ordner angezeigt werden. Einige Dateisysteme haben eine vorhersagbare Reihenfolge (z. B. Sortierung nach Erstellungsdatum), aber da die meisten Betriebssysteme mehrere verschiedene Dateisysteme (die möglicherweise unterschiedliche Ordnungen haben) unterstützen, hilft das nicht viel. Stattdessen ist es normalerweise Sache jedes Client-Programms, das die Dateinamen liest, um sie selbst zu sortieren, wenn es die Reihenfolge interessiert. Viele Low-Level-Programme kümmern sich nicht um die Reihenfolge, also ist dies wahrscheinlich eine vernünftige Wahl für die OS-Designer (die nicht den Overhead der Sortierung der Dateinamen auferlegen wollen, wenn sie nicht benötigt werden).

Also, das Problem, das Sie haben, ist nicht wirklich ein Problem mit Ihrem Python-Code. Es ist eher ein Problem mit Ihrer IDE, das Sie wahrscheinlich nicht ändern können. Es sortiert die Ordner, die Sie lexikografisch erstellt haben, was bedeutet, dass 10 vor 2 kommt, genau wie ba vor c in alphabetischer Reihenfolge kommt. Wenn Ihre IDE nicht über einige Funktionen verfügt, um ihre Sortiermethode zu ändern (was unwahrscheinlich erscheint), können Sie das wahrscheinlich nicht direkt beheben.

Der von Ihrem Betriebssystem bereitgestellte Dateimanager sortiert möglicherweise anders (und gibt mehr Optionen für das Sortieren). Viele Programme benutzen eine sogenannte "natürliche Sortierung" für Dateinamen. Dadurch werden die Namen in numerische und nicht-numerische Teile getrennt und dann jeweils als separater Schritt der Sortierung verwendet (wobei die entsprechenden numerischen Teile nach Zahl und nicht lexikografisch sortiert sind). Wenn Sie Ihren eigenen Code schreiben, um die Ordner anzuzeigen, müssen Sie das möglicherweise replizieren, aber in der aktuellen Situation scheint es nicht notwendig zu sein.

Was Ihnen helfen könnte, ist, die Namen zu zero-Pad. Erstellen Sie keine Ordner mit den Namen 1 und 2, sondern erstellen Sie 01 und 02. Dann wird eine naive Art 10 nach 09 statt zwischen 1 und 2 setzen.Hier ist, wie Sie Ihre Ordner Erstellung Logik ändern können mit Nullen aufgefüllt Zahlen zu arbeiten:

zoom_levels = [i for i in range(zoom_min, zoom + 1)] 
folders_for_xtiles = [k for k in range(0, 2 ** zoom] 
for zoom_level, folder_for_xtile in itertools.product(zoom_levels, folders_for_xtiles): 
    os.makedirs(os.path.join(path_to_tiles_folder, 
          format(zoom_level, '02'), 
          format(folder_for_xtile, '02'))) 

Die wichtigste Änderung ist format zu verwenden, anstatt str die Zahlen in Strings zu drehen. Ich übergebe den 02 Formatierungscode, um Python zu sagen, die Zahlen auf zwei Ziffern mit führenden Nullen aufzufüllen. Beachten Sie, dass ich die sorted Anrufe aus der Liste Comprehensions entfernt habe, da sie nichts getan haben (range produziert bereits Ergebnisse in aufsteigender Reihenfolge, nicht dass es wirklich wichtig für unsere Zwecke ist).

Der letzte Codeblock, den Sie anzeigen, schlägt vor, dass Sie beim Zugriff auf die Ordner die Namen direkt nach Nummer neu erstellen, anstatt die Ordner zu durchsuchen und das Betriebssystem nach den Namen zu fragen. Wenn Sie das tun, müssen Sie sich nicht um die Reihenfolge kümmern, in der die Ordner erstellt wurden (oder in der Reihenfolge, in der sie in einem anderen Programm angezeigt werden). Wenn Sie die Nummern in der richtigen Reihenfolge erstellen, greifen Sie auch in der richtigen Reihenfolge auf die Ordner zu. Es spielt keine Rolle, welche Reihenfolge das Dateisystem bietet, da Sie das Dateisystem nicht danach fragen, welche Ordner es gibt, da Sie deren Namen im Voraus kennen.

+0

Vielen Dank für Ihre ausführliche, explizite und verständliche Antwort! Ich schätze das sehr! –

1

Dies scheint eher ein Betriebssystem Verhalten als Python Verhalten. Versuchen Sie, die Ordnernamen 1 bis 9 mit einer Null aufzufüllen. Zum Beispiel:

for zoom_level in range(zoom_min, zoom + 1): 
    xtile_path = os.path.join(path_to_tiles_folder, str(zoom_level)) 
    for xtile_number in range(0, 2 ** zoom): 
     xtile_folder_name = str(xtile_number).zfill(2) if len(str(xtile_number)) == 1 else str(xtile_number) 
     ytile_path = os.path.join(xtile_path, xtile_folder_name) 
Verwandte Themen