os. rename, OSError: [WinError 87] Falscher Parameter ?

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
fabiannull
User
Beiträge: 2
Registriert: Donnerstag 25. Februar 2021, 15:24

Hallo,

ich bin relativ neu bei der Sprache Python da ich Python für kleinere Seitenprojekte nutze.

Ich möchte Dateien automatisch umbenennen und nutze folgenden Code:

Code: Alles auswählen

import os
src = 'C:\\Users\\proje\\OneDrive\\Desktop\\msg\\test.msg'

dst = 'C:\\Users\\proje\\OneDrive\\Desktop\\msg\\2021' + month_final + '24' + '_' + sender_final + '_' + empfaenger_final + msg_subj + '.msg'

os.rename(src, dst)

Als Fehlermeldung bekomme ich:

os.rename(src, dst)
OSError: [WinError 87] Falscher Parameter: 'C:\\Users\\proje\\OneDrive\\Desktop\\msg\\test.msg' -> 'C:\\Users\\proje\\OneDrive\\Desktop\\msg\\20210224_sender_empfaenger_betreff.msg'


Ich kann mir hier absolut nicht helfen und würde mich über ein wenig Feedback / Hilfe freuen.

Herzlichen Dank.
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fabiannull: Ist das die tatsächliche Fehlermeldung oder hast Du da Daten wie sender, empfänger, und/oder betreff ausgetauscht?

Anmerkungen zum Quelltext: Man sollte Namen nicht kryptisch abkürzen. Wenn man `source`, `destination`, und `message_subject` meint, sollte man nicht `src`, `dst`, und `msg_subj` schreiben. Die `final`-Suffixe machen einen komischen Eindruck.

Für Pfadoperationen gibt es das `pathlib`-Modul.

Das zusammenstückeln von Zeichenketten und Werten mittels ``+`` ist eher BASIC als Python. Dafür gibt es die `format()`-Methode auf Zeichenketten und f-Zeichenkettenliterale.

Code: Alles auswählen

#!/usr/bin/env python3
from pathlib import Path


def main():
    month = "02"
    sender = "sender"
    empfaenger = "empfaenger"
    message_subject = "_betreff"  # Oder kommt der _ vom `empfaenger`?

    path = Path(R"C:\Users\proje\OneDrive\Desktop\msg\test.msg")
    path.rename(
        path.with_name(
            f"2021{month}24_{sender}_{empfaenger}{message_subject}.msg"
        )
    )


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@fabiannull: Unter Windows darf nicht jedes Zeichen im Dateinamen vorkommen. Und "Betreff" klingt, als könnte darin ein Doppelpunkt vorkommen.
Wie __blackjack__ schon sagte: Zeig Fehler, wie sie auftreten - nicht mit ersetzten Teilen.
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

Blind geraten: Eine der merkwürdig benannten Variablen im neuen Namen der Datei enthält für Dateinamen nicht zulässige Zeichen.

Edit: sparrow war schneller :P
fabiannull
User
Beiträge: 2
Registriert: Donnerstag 25. Februar 2021, 15:24

Danke für den schnellen und guten Input.

Meine Frage war ja wie ich mit diesem Fehler umgehe bzw. den Fehler beheben kann: os. rename, OSError: [WinError 87] Falscher Parameter

Antwort: Ich habe beim umbenennen den Betreff der E-Mail verwendet die eingelesen wurde und dabei ein ":" der automatischen Antwortfunktion von Outlook übersehen. Das war der Fehler da dieses Zeichen nicht in einem Dateinamen enthalten sein darf.

Die anderen Kritikpunkte mit dem verketten der Zeichenketten + Variablennamen habe ich dankend angekommen und umgesetzt.

Ab hier komm ich erstmal alleine weiter.

Vielen Dank.
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@fabiannull: Es wäre jetzt aber zu kurz gesprungen nur ":" zu beachten, denn im Betreff kann letztlich jedes Zeichen vorkommen beispielsweise auch ein "/" der auf sehr vielen Dateisystemen kein Bestandteil eines Dateinamens sein darf. Aber auch andere Zeichen. Welche erlaubt sind, hängt vom Dateisystem ab. Unter den üblichen Unix/Linux/Mac-Dateisystemen wäre ein Doppelpunkt beispielsweise kein Problem. Wenn das auf nahezu beliebigen Dateisystemen funktionieren soll, sollte man den Dateinamen gründlich von ”Sonderzeichen” säubern. Und sich dann aber auch Gedanken machen wie man damit umgeht wenn ursprünglich unterschiedliche Dateinamen, nach dem ”säubern” gleich sind. Wobei ”gleich” unter Windows sogar noch Gross-/Kleinschreibung ignoriert.

Oh und Dateinamen können auf verschiedenen Dateisystemen unterschiedliche maximale Längen haben. So ein Betreff könnte diese maximale Länge überschreiten.

Unterm Strich ist das keine gute Idee nahezu beliebige Daten in einen Dateinamen zu stecken.

Hier wurde auch noch nicht beachtet das jemand absichtlich böswillig Sachen ausprobiert, also beispielsweise "../../../../../../../windows/system32/vbrun400.dll" oder so etwas in den Betreff schreibt und mal schaut was passiert.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten