Benennung von Files

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
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Hallo zusammen,

ich würde gerne meine Files, die momentan nur aus Integers bestehen (10000001.xml, ....), umbenennen.
Der Namensanfang soll immer gleich sein, also: "deutsch_01_" und dann soll eine Zahl ab "01" folgen, d.h.:
deutsch_01_01.xml
deutsch_01_02.xml
usw.

Wie bekommt man das hin, inbesondere das "0" für Zahlen zwischen 1 und 9?
Mit Integers kanns schwierig werden, oder?

Code: Alles auswählen

for filename in os.listdir("."):
    if filename.startswith("1"):
        os.rename(filename, "deutsch_01_" + )
Herzlichen Dank für jeden Tipp. :)
Zuletzt geändert von MarcelF6 am Donnerstag 13. Februar 2014, 22:18, insgesamt 1-mal geändert.
BlackJack

@MarcelF6: Zeichenkettenformatierung ist das Stichwort. Heutzutage mit der `format()`-Methode auf Zeichenketten. Da kann man für Zahlen alle möglichen Formatierungsanweisungen verwenden, inklusive wieviele Stellen, ob führende 0en oder nicht, …
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Danke für den Tipp.
Ich machte es in der Zwischenzeit so:

Code: Alles auswählen

import os
i = 1
for filename in os.listdir("."):
    os.rename(filename, "deutsch_01_" + "%02d" % (i,) + ".xml")
    i += 1
	
Warum werden die Files nicht der Reihe nach gelesen? Bzw. wie kann ich das noch berücksichtigen, dass die Files der Reihe nach eingelesen werden sollen? (Sie sind ja ursprünglich nummeriert)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Indem du das Ergebnis von `os.listdir` sortierst. `sorted` und sein `key` Argument sind hier das Stichwort.
Wahrscheinlich willst du nach der 2. Zahl als Zahl (nicht String) sortieren, dann kannst du in der `key` Funktion diese Zahl extrahieren und in eine Zahl umwandeln.
BlackJack

@MarcelF6: In welcher Reihenfolge die Namen von `listdir()` kommen ist nicht definiert und dürfte vom Betriebssystem und dort speziell vom Treiber für das Dateisystem abhängen. Wenn Du eine bestimmte Reihenfolge haben möchtest muss Du die Liste entsprechend sortieren. Wenn lexikographisch ausreicht, einfach die `sort()`-Methode aufrufen. Ansonsten muss man eine Funktion schreiben die aus einem Element der Liste einen Sortierschlüssel erstellt und die als `key`-Argument bei `sort()` übergeben.

Die fortlaufende Nummer kann man mit der `enumerate()`-Funktion einfacher erstellen als sie manuell hoch zu zählen.

Wieso machst Du das mit dem Namen so kompliziert? Man kann den Platzhalter doch in *eine* Zeichenkette formatieren, statt da hinterher vorne und hinten noch etwas anzuhängen.

Ungetestet:

Code: Alles auswählen

    filenames = os.listdir(os.curdir)
    filenames.sort()
    for i, filename in enumerate(filenames, 1):
        os.rename(filename, 'deutsch_01_{0:02d}.xml'.format(i))
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Vielen Dank für die kompetente Auskunft!
Ich habe sowieso gerade etwas festgestellt...die Filenames sind leider ziemlich willkürlich gewählt.
Es handelt sich aber immer um xml-Files, welche einen Tag "title" haben. Die Struktur der Files sieht so aus:

Code: Alles auswählen

<article>
    <otherTags>
    </otherTags>
    <title>editorial</title>
</article>
Ich kenne die Reihenfolge der "title"-Tags, d.h.:
1.) Editorial
2.) Content
3.) Club
usw.

Gibt es eine Möglichkeit (wie), die XML-Files durchzugehen, sie entsprechend zu ordnen und ihnen dann den "korrekten" Namen zu geben, d.h. "deutsch_01_01.xml" für das xml-File mit dem Title "editorial", "deutsch_01_02.xml" für das File mit dem Title "content" usw.?

Ganz herzlichen Dank für die Hilfe! :)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

MarcelF6 hat geschrieben:Gibt es eine Möglichkeit (wie), die XML-Files durchzugehen, sie entsprechend zu ordnen und ihnen dann den "korrekten" Namen zu geben, d.h. "deutsch_01_01.xml" für das xml-File mit dem Title "editorial", "deutsch_01_02.xml" für das File mit dem Title "content" usw.?
Ja. Die Möglichkeit gibt es. Welches Wissen fehlt dir denn konkret dafür?

Es ist ja jetzt nichts dramatisches. Passende Datenstruktur wählen, Informationen aus den Dateien mit einem XML-Parser auslesen, benötigte Daten in die Datenstruktur packen, Jeden Eintrag in eine Liste werfen, Liste sortieren. Dann sortierte Liste abarbeiten.
Antworten