Seite 1 von 1
os. rename, OSError: [WinError 87] Falscher Parameter ?
Verfasst: Donnerstag 25. Februar 2021, 19:45
von fabiannull
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.
Re: os. rename, OSError: [WinError 87] Falscher Parameter ?
Verfasst: Freitag 26. Februar 2021, 05:42
von __blackjack__
@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()
Re: os. rename, OSError: [WinError 87] Falscher Parameter ?
Verfasst: Freitag 26. Februar 2021, 06:52
von sparrow
@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.
Re: os. rename, OSError: [WinError 87] Falscher Parameter ?
Verfasst: Freitag 26. Februar 2021, 06:55
von einfachTobi
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

Re: os. rename, OSError: [WinError 87] Falscher Parameter ?
Verfasst: Freitag 26. Februar 2021, 13:37
von fabiannull
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.
Re: os. rename, OSError: [WinError 87] Falscher Parameter ?
Verfasst: Freitag 26. Februar 2021, 17:50
von __blackjack__
@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.