Dateien umbenennen mit Python

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
sn0oz3
User
Beiträge: 6
Registriert: Mittwoch 23. Mai 2018, 14:26

Hallo Community,
ich befasse mich seit 3 Tagen etwas intensiver mit Python und habe mir ein kleines Szenario gebastelt:

Ich habe einen Ordner mit 5 Dateien angelegt, die heißen einfach nur 1,2,3 usw. Diese wollte ich mittels Python in folgendes Schema bringen "file1.txt", "file2.txt", usw.
Mein Code tut an sich das, was er soll, allerdings liefert mir IDLE auch einen Fehler. Da ich ein absoluter Anfänger bin, bitte ich um Nachsicht und hoffe auf den ein oder anderen Tipp von euch, wie man es besser machen kann.

Grüße
sn0oz3

Code: Alles auswählen

#------------------------------------------#
# Importieren der benötigten Bibliotheken  #
#------------------------------------------#

import os

#------------------------------------------#
#          Variablen deklarieren           #
#------------------------------------------#

datei = "file"
ende =".txt"


#------------------------------------------#
#               Schleife                   #
#------------------------------------------#

for x in range(0,4):
        for i in range(1,6):
            inhalt  = os.listdir()
            name = datei + str(i) + ende
            os.rename(str(inhalt[x]), name)
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ersetze mal os.rename durch print und schau mal was da so ausgegeben wird und in der Doku zu os.rename ob die Funktion damit arbeiten kann.

Code: Alles auswählen

for x in range(0,4):
        for i in range(1,6):
            inhalt  = os.listdir()
            name = datei + str(i) + ende
            print((str(inhalt[x]), name))
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

sn0oz3 hat geschrieben: Mittwoch 23. Mai 2018, 14:52 allerdings liefert mir IDLE auch einen Fehler. Da ich ein absoluter Anfänger bin, bitte ich um Nachsicht und hoffe auf den ein oder anderen Tipp von euch, wie man es besser machen kann.
Hallo, du könntest den Fehler hier rein kopieren. :)
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast 5 Dateien aber 25 Schleifendurchgänge. Da kann also etwas nicht stimmen. Welche Datei Du jetzt in welche umbenannt hast, ist im Glücksfall reiner Zufall. Im schlimmsten Fall heißen zum Schluß alle Dateien gleich, also "datei6.txt", also 4 der fünf Dateien sind verloren. Du mußt Dich entscheiden, ob Du die Dateinamenpaare rein generisch aus Nummern erzeugst, oder ob Du die Verzeichnisliste durchgehst und die Dateiennamen nach einem Muster veränderst. Du machst gerade beides gleichzeitig, was nur zu Chaos führt.
sn0oz3
User
Beiträge: 6
Registriert: Mittwoch 23. Mai 2018, 14:26

Vielen Dank schon einmal für die Antworten

Leider wurde ich aus der Dokumentation nicht wirklich schlauer.

@Sirius3: Ich will auf jeden Fall die Dateien nach einem bestimmten Muster der Reihe nach verändern. Und genau da hängt es bei mir. Ich habe keine Idee außer das wirre Konstrukt, das ich gebastelt habe.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@sn0oz3: wenn Dir ein Muster vorschwebt, dann wirst Du gewiss eine Vorstellung davon haben. Wie kommst Du auf das "wirre Konstrukt"? Besser Du erklärst das Muster der vorliegenden Dateinamen und nach welchem Schema Du diese umbenennen möchtest. Dann kommt vielleicht etwas Klarheit in Dein Vorhaben.
sn0oz3
User
Beiträge: 6
Registriert: Mittwoch 23. Mai 2018, 14:26

Also der Gedanke ist, wie gesagt ich bin blutiger Anfänger, daher das wirre Konstrukt, dass ich alle Dateien in einem Ordner nach dem Schema file1, file2, file3, usw. umbenenne und dabei der ursprüngliche Dateiname keine Rolle spielt.

Edit: Das große Problem für mich ist, die Schleife zu erstellen, die Datei für Datei durchgeht und dabei hinten eine fortlaufende Nummer, beginnend bei 1, anhängt
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

erster Schritt zur Lösung des Problems ist, das Problem möglichst exakt zu formulieren. Du hast einen Dateinamen A und willst in nach Dateinamen B umbenennen. Wie ist die Regel?
sn0oz3
User
Beiträge: 6
Registriert: Mittwoch 23. Mai 2018, 14:26

Naja nach welchem Schema ich es vorgesehen hatte, habe ich bereits erwähnt.
Konnte es jetzt aber auch endgültig realisieren, wie ich es wollte.

Falls es Verbesserungsvorschläge gibt, gerne her damit :)

Code: Alles auswählen

#------------------------------------------#
# Importieren der benötigten Bibliotheken  #
#------------------------------------------#

import os

#------------------------------------------#
#          Variablen deklarieren           #
#------------------------------------------#

datei = "file"
end = ".txt"


#------------------------------------------#
#               Schleife                   #
#------------------------------------------#

i = 1

for x in range(0,len(os.listdir())-1):
        inhalt  = os.listdir()
        name = datei + str(i) + end
        os.rename(str(inhalt[0]), name)
        i +=1
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Du willst also, dass wenn in einem Verzeichnis n Dateien sind, n-1 mal eine beliebige dieser Dateien nach "file{i}.txt" umbenannt wird?
Wenn Dir also egal ist, wie welche Datei heißt, warum willst Du sie dann umbenennen? Und warum gerade n-1 mal?
Mit anderen Worten, das Programm macht im besten Fall zufällig das, was Du willst.

Meine Frage war nicht, ob wir wissen, wie Du die Dateien umbenennen willst, sondern ob Du es weißt. Und auch wenn Du es weißt, aber nicht in der Lage bist, es präzise zu formulieren, ist es schwierig, das in ein Programm umzusetzen. Daher nochmal die Aufgabe: Formuliere so präzise wie möglich, nach welchem Schema Du eine Menge an Dateien in eine andere Menge von Dateien umbenennen willst.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Ich hätte hier einen Verbesserungsvorschlag. Die Verbesserung besteht darin, dass alle Dateien berücksichtigt werden :) :

Code: Alles auswählen

import os
import random
import string

characters = string.ascii_letters + string.digits
for each in os.listdir():
    os.rename(each, ''.join(random.sample(characters, 8)))
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@kbr: und wieder mit der Chance, dass Dateien im Nirvana verschwinden.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Sirius3: Dieses Feature bleibt ausdrücklich erhalten ... schmunzeln ist erlaubt ... :wink: ... denn dieser Code ist genau wie der ursprüngliche auch ... sinnfrei ...
sn0oz3
User
Beiträge: 6
Registriert: Mittwoch 23. Mai 2018, 14:26

Sirius3 hat geschrieben: Donnerstag 24. Mai 2018, 08:06 Meine Frage war nicht, ob wir wissen, wie Du die Dateien umbenennen willst, sondern ob Du es weißt. Und auch wenn Du es weißt, aber nicht in der Lage bist, es präzise zu formulieren, ist es schwierig, das in ein Programm umzusetzen. Daher nochmal die Aufgabe: Formuliere so präzise wie möglich, nach welchem Schema Du eine Menge an Dateien in eine andere Menge von Dateien umbenennen willst.
Ich frage mich, wo es hier Zweifel daran gibt, dass ich nicht weiß, was ich möchte. Steht eigentlich alles hier:
"Ich habe einen Ordner mit 5 Dateien angelegt, die heißen einfach nur 1,2,3 usw. Diese wollte ich mittels Python in folgendes Schema bringen "file1.txt", "file2.txt", usw."
Ich habe mir als Anfänger einfach eine Problematik ausgedacht, Sinn hin oder her. Zum Schluss habe ich ja mein Ziel erreicht. Ich wollte lediglich wissen, deshalb habe ich auch den Code gepostet, wo der Fehler in meiner Schleife liegt.

Naja...
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

sn0oz3 hat geschrieben: Donnerstag 24. Mai 2018, 19:43 die heißen einfach nur 1,2,3 usw. Diese wollte ich mittels Python in folgendes Schema bringen "file1.txt", "file2.txt", usw."
Das ist zumindest für mich in Deinem recht unglücklichen Code untergegangen. Dabei wäre die Lösung dann doch sehr einfach gewesen:

Code: Alles auswählen

for each in some_collection:
    os.rename(each, 'file{}.txt'.format(each))
sn0oz3
User
Beiträge: 6
Registriert: Mittwoch 23. Mai 2018, 14:26

Ja das mag natürlich sein, aber mir würde ja geraten meine Frage präziser zu formulieren. Dass der Code höchstwahrscheinlich nicht die beste Art und Weise ist, war mir klar.
kbr hat geschrieben: Donnerstag 24. Mai 2018, 19:54 Das ist zumindest für mich in Deinem recht unglücklichen Code untergegangen. Dabei wäre die Lösung dann doch sehr einfach gewesen:

Code: Alles auswählen

for each in some_collection:
    os.rename(each, 'file{}.txt'.format(each))
Danke, denn genau auf so etwas wollte ich hinaus. Werde es morgen gleich ausprobieren.
Antworten