Filenamen Systematisch umbenennen mit Forschleife

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
Beate
User
Beiträge: 7
Registriert: Mittwoch 7. November 2018, 12:47

Hallo,

ich habe folgendes Probem: Ich werte viele viel (tausende) von Bildern aus. Die Kamera erstellt filenamen vom folgenden Typ: cam_4103167059_1.png,cam_4103167059_2.png, ..., cam_4103167059_10.png, cam_4103167059_20.png...cam_4103167059_100.png...cam_4103167059_1000.png.
Mich interessiert die Zahl zwischen dem zweiten unterstrich und dem Punkt. Es stört mich dass hier die führenden Nullen fehlen.

Ich habe eine Liste mit allen Fialnamen.
Ich wandle die Liste in einen String und ich versuche den String aufzuspalten und möchte dann automatisch die Nullen einfügen.

imagefilenames_strg = ""
for i in imagefilenames:
imagefilenames_strg = imagefilenames_strg+ ","+str(i)
print (imagefilenames_strg)

Funktioniert prima

A B E R
for j in imagefilenames_strg:
Zahl = (imagefilenames_strg[imagefilenames_strg.find("_") + 1:imagefilenames_strg.find(".")])+","+(j[j.find("_") + 1:imagefilenames_strg.find(".")])
print (Zahl)

Funktioniert nicht- ich weiss auch nicht so genau wie ich die Zählvariable in die Formel mit hineinschreiben muss.
Die For schleifen beispiele die ich gefunden habe sind alle viel weniger complex und enden immer mit dem print(i). Aber muss hier ja erst noch Änderungen vornehmen.


Über Hilfe freue ich mich sehr!

Danke für eure Tipps!
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hallo Beate,

bitte in Zukunft deinen Code in code-tags setzten, damit man den verstehen kann. Denn so gehen sonst die Einrueckungen verloren.

Bezueglich deines Problems: ich wuerde da einfach mit spring split arbeitn:

Code: Alles auswählen

>>> s = "cam_4103167059_10.png"
>>> zahl = int(s.split(".")[0].rsplit("_", 1)[1])
Das spaltet erstmal am Punkt und nimmt den Teil links davon, und dann von rechts kommen am Unterstrich, aber nur einen Unterstrich. Davon der rechte Teil mit Index 1 ist dann deine gesuchte Zahl.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Beate: warum willst Du die Liste erst in einen String umwandeln? Das macht doch das Finden der Zahlen viel komplizierter?

Vermeide beim Programmieren kryptische Abkürzungen (was soll strg heißen) und einbuchstabige Namen. i ist für einen Dateinamen ein ziemlich schlechter Name, `filename` wäre da besser. `j` ist für ein einzelnes Zeichen auch ein schlechter Name, würdest Du es character nennen, wäre gleich klar, über was Du da in der zweiten for-Schleife iterierst.

Zum Zusammensetzen von Strings gibt es join:

Code: Alles auswählen

imagefilenames_as_long_string = ','.join(imagefilenames)
Statt mit find und Indexzugriff arbeitet man am besten mit split und List-Operationen.
Beate
User
Beiträge: 7
Registriert: Mittwoch 7. November 2018, 12:47

Hallo Vielen Dank deets! Das tut prima, ich bekomme jetzt erfolgreich immer die erste Zahl des ersten Dateinamen. Also z.B. die 10 und es tut auch für größere Werte wie z.B. 4013.

jetzt muss ich nur noch herausfinden wie ich die Schleife richtig definiere. Es scheint ja vollkommener Unsinn zu sein so wie ich es geschrieben habe sonst hätte niemand meine Zählvariable j für einen Dateinamen halten können(...).
Beate
User
Beiträge: 7
Registriert: Mittwoch 7. November 2018, 12:47

Ich schaffe es führende Nullen einzufügen aber als Schleife über alle meine Dateinamen läuft das nicht.

Code: Alles auswählen

imagefilenames = os.listdir(inputDirectory) 
imagefilenames_string = ""

for i in imagefilenames:
    imagefilenames_string = imagefilenames_string + ","+str(i)
    # print (imagefilenames_strg)

for j in imagefilenames_string:
     zahl = int(imagefilenames_string.split(".")[0].rsplit("_", 1)[1])
     zahl = str(zahl).zfill(5)
                   # +","+int(imagefilenames_string(j).split(".")[0].rsplit("_", 1)[1])
print(zahl)
Beate
User
Beiträge: 7
Registriert: Mittwoch 7. November 2018, 12:47

Vor allem ist mir nicht klar wo ich in meiner Rechnung die Laufvaraible einsetze- an welcher Stelle im Code kann ich das machen? Imagefilenames_string(j) versteht er nicht.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte gewoehn dir mal ab so kurze und nichts-sagende Variablennamen zu benutzen. i, j, k sind gut und schoen wenn man Indizes braucht, zB bei mathematischen Formeln. Aber fuer alles andere unverstaendlich. Fuer uns hier und jetzt, und fuer Zukunfts-Beate in drei Wochen spaetestens.

Ein Weg dein Problem zu loesen ist replace. Das funktioniert deshalb, weil du mit dem _ und . um die Zahl eine eindeutige Abgrenzung hast.

Code: Alles auswählen

neuer_name = alter_name.replace("_{}.".format(zahl), "_{:05}.".format(zahl))
Hierbei muss zahl Integer sein! Also NICHT wieder mit str behandelt!
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Beate hat geschrieben: Mittwoch 7. November 2018, 16:27 Es scheint ja vollkommener Unsinn zu sein so wie ich es geschrieben habe sonst hätte niemand meine Zählvariable j für einen Dateinamen halten können(...).
Vor allem Python hält Deine Zählvariable j für einen Dateinamen, weil j keine Zählvariable ist! Schau Dir in Deinem Tutorial, mit dem Du Python lernst, nochmal an, wie Schleifen funktionieren.

Es ist immer noch so, dass es unsinnig ist, erst die Dateinamen in einen String zu packen um später darauf herumzuarbeiten, weil Du ja für jeden Dateinamen einzeln die Ersetzung machen willst.
Für jeden Dateinamen willst Du
1. Basis und Erweiterung trennen.
2. Basis am letzten _ in Präfix und Zahl trennen
3. Zahl mit 0len füllen
4. Präfix 0Zahl und Erweiterung zusammensetzen

5. Zusammensetzen der Dateinamen zu einem String.
Antworten