Dateien aufgrund von Variablen umbenennen, verschieben und löschen

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@novregen: Da ist das Python anscheinend zu alt für f-Zeichenketten. Dann müsste man an der Stelle die `format()`-Methode auf Zeichenketten verwenden.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
novregen
User
Beiträge: 15
Registriert: Montag 14. Januar 2019, 11:49

Hallo blackjack,

danke, aber ich wußte nicht ganz genau wie ich es machen musste. Mit format() hat es nicht geklappt. So mit .format funktioniert es zumindest so weit, das ich Dateien
2019-01-16_RG-Amazon etc. erhalten, was jedoch noch nicht funktioniert ist, das der Teil des alten Namen mit übernommen wird. Also z.B. Ursprung "ReA_Instar Kamera"
neu dann 2019-01-16_RG-Amazon_Instar Kamera

Code: Alles auswählen

filenames = glob.iglob(os.path.join(SOURCE_PATH, prefix + '*.pdf'))
        for old_filename in filenames:
            new_filename = os.path.join(TARGET_PATH, '{}_{}.pdf'.format(today, name_part))
            os.rename(old_filename, new_filename)
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@novregen: dann schau Dir in der Dokumentation noch einmal an, wie man format benutzt.
novregen
User
Beiträge: 15
Registriert: Montag 14. Januar 2019, 11:49

Tut mir leid, ich komme irgendwie nicht darauf, wo dieser Teil des Names separiert wird, und wie er definiert ist, das ich ihn dort verwenden könnte.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@novregen: Der Teil des Namens wird nicht separiert, ist also nirgends definiert. Das musst Du halt machen, also Code dafür schreiben. Du hast ja den Präfix der weg soll und den gesamten Pfad als Ausgangsdaten. Davon brauchst Du den Dateinamen, und von dem dann nur den Teil nach dem Präfix. Für's erste gibt es eine Funktion in `os.path`, und das zweite sind Grundoperationen bei Zeichenketten die im Tutorial in der Python-Dokumentation vorkommen. Die Länge des Teils ermitteln der nicht im Ergebnis sein soll und dann die entsprechende Teilzeichenkette erstellen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
novregen
User
Beiträge: 15
Registriert: Montag 14. Januar 2019, 11:49

Ich komme hier irgendwie nicht weiter, könnte mir jemand helfen ?
ich habe os.path eingebaut, jedoch bekomme ich jetzt den Source_Path Ordner angehängt
also Sourcpath lautet ja volume1/xx und als splitname hängt er mir jetzt xx an , ich komme da nicht an den eigentliche Dateinamen hinter dem Prefix_

Code: Alles auswählen

def main():

    today = datetime.date.today()
    
    path, splitname = os.path.split(SOURCE_PATH)
    splitname = os.path.splitext(splitname)[0]

    for prefix, name_part in [
        ('ReA', 'RG-Amazon'),
        ('GsA', 'GS-Amazon'),
        ('ReT', 'RG-Telekom'),
        ('NoE', 'Notiz-EDV'),
    ]:
        filenames = glob.iglob(os.path.join(SOURCE_PATH, prefix + '*.pdf'))
        for old_filename in filenames:
            new_filename = os.path.join(TARGET_PATH, '{}_{}_{}.pdf'.format(today, name_part, splitname))
            os.rename(old_filename, new_filename)


if __name__ == '__main__':
    main()
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@novregen: Wo steht denn die Information die mit in den Zielnamen soll? In `SOURCE_PATH`? Doch wohl eher nicht.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
novregen
User
Beiträge: 15
Registriert: Montag 14. Januar 2019, 11:49

@blackjack wenn Source Path nur der Quellpfad ist und nicht die Dateien darin wiedergibt, dann dort nicht, aber wie gebe ich den Pfad dort als variabel an und begrenze es dann auf den Part nach dem Prefix_ ?
Ich komme da einfach nicht weiter.

Code: Alles auswählen

splitname = os.path.basename('volume1\xx\*.pdf')
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@novregen: An der Stelle gar nicht, Du brauchst ja einzelne, konkrete Dateinamen um Informationen daraus zu extrahieren. Und diese Dateinamen kennst Du ja vor der Abfrage der Dateinamen noch nicht. Also kannst Du an die Informationen auch erst heran kommen wenn Du die Dateinamen, also Informationen, vorliegen hast.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
novregen
User
Beiträge: 15
Registriert: Montag 14. Januar 2019, 11:49

muss ich das in die for schleife reinschreiben, oder wie stelle ich das an ?
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@novregen: Du brauchst den Dateinamen aus dem Du etwas extrahieren willst. Wo hast Du den denn? Tipp: Den brauchst Du ja zum Umbenennen, also *musst* Du den ja haben. Und irgendwo zwischen dem Punkt wo Du den jeweils einzelnen alten Dateinamen bekommst und dem umbenennen, musst Du da Deine Infos heraus holen. Das muss vor dem umbenennen passieren, weil Du die Infos ja für den neuen Dateinamen benötigst, den Du wiederum zum umbenennen benötigst.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
novregen
User
Beiträge: 15
Registriert: Montag 14. Januar 2019, 11:49

hmmm, an dieser stelle muss das doch vorliegen oder ?

Code: Alles auswählen

filenames = glob.iglob(os.path.join(SOURCE_PATH, prefix + '*.pdf'))
wenn ich darunter dies einfüge, bekomme ich alle Dateinamen vom Typ PDF =:-( wie bekomme ich jetzt noch den EINEN richtigen Dateinamen und dann noch die Hürde nur alles hinter dem _

Code: Alles auswählen

splitnames = [os.path.basename(fpath) for fpath in glob.glob("/volume1/xx/*.pdf")]
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@novregen: Ich geb''s auf. Solltest Du vielleicht auch wenn Du den alten Dateinamen brauchst, und in den paar Zeilen Code es nicht schaffst den zu finden. Wahrscheinlich ist der einfach zu schlecht benannt. :twisted:
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
novregen
User
Beiträge: 15
Registriert: Montag 14. Januar 2019, 11:49

ja wahrscheinlich hast du recht, doch ein fertiges Programm.... :evil:

Hier sollte die Datei vorhanden sein, aber auch mit filenames in dem os.path teil bekomme ich da nichts sinnvolles raus..

Code: Alles auswählen

filenames = glob.iglob(os.path.join(SOURCE_PATH, prefix + '*.pdf'))
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

"filenames" deutet Mehrzahl an. Sind da nicht alle Dateien drin?
In Python benutzt man sprechende Variablennamen, die direkt auf den Inhalt schließen lassen und leicht verständlich sind. Wie würdest du eine Variable benennen, die auf den alten Dateinamen verweist?
novregen
User
Beiträge: 15
Registriert: Montag 14. Januar 2019, 11:49

ich würde sie old_filename benennen, aber ich sehe hier nicht das old_filename irgendwie definiert ist und komme damit auch nicht weiter.

Code: Alles auswählen

filenames = glob.iglob(os.path.join(SOURCE_PATH, prefix + '*.pdf'))
        
        for old_filename in filenames:
            new_filename = os.path.join(TARGET_PATH, '{}_{}_{}.pdf'.format(today, name_part, NUR DEN TEXT HINTER _))
            os.rename(old_filename, new_filename)

hier kommen alle pdf namen und nicht der eine der gerade umbenannt wird.

Code: Alles auswählen

splitname = [os.path.basename(fpath) for fpath in glob.glob("/volume1/TD/*.pdf")]
Vielleicht könnte mir ja jemand mit einem stück code weiterhelfen, ich würde nur für diese eine Problem eine Lösung suchen und habe mit pyhton bislang nichts gemacht,
deshalb fällt es schwer, das alles so auf einmal anzuwenden.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@novregen: Du siehst in dem Code `old_filename` nicht? Äh… das steht da aber. Einmal wo der Wert für jeden Schleifendurchlauf definiert wird und einmal da wo der Wert zum umbenennen verwendet wird. Umbenennen würde ohne ja gar nicht funktionieren – woher sollte die `rename()`-Funktion sonst wissen was umbenannt werden soll‽
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten