Seite 1 von 1
Variableninhalt als Dateinamen verwenden?
Verfasst: Donnerstag 22. Mai 2014, 16:23
von duodiscus
Hallo zusammen,
ich habe zum Test ein Programm geschrieben, welches einen Namen vom Anwender per input Befehl verlangt. Dieser Name wird in einer Variablen hinterlegt (in diesem Fall name_person).
Jetzt möchte ich eine .txt datei erstellen, die den Dateinamen der vorherigen Eingabe aus der Variable trägt.
Code: Alles auswählen
name_person = eval(input('Name für Person eintragen: ')
f=open('/Users/Documents/name_person' , 'wb')
So wie dargestellt scheint das nicht zu funktionieren. Weiß jemand wie ich das einfach auf die Reihe bekomme? Danke schonmal!

Re: Variableninhalt als Dateinamen verwenden?
Verfasst: Donnerstag 22. Mai 2014, 16:27
von EyDu
Hallo,
das eval is falsch und solltest du gleich weglassen. Was glaubst du, was es tut? Dateien solltest du immer mittels with-Statement öffnen, dann werden sie auch wieder geschlossen. Gerade bei zu schreibenden Dateien ist das von Vorteil

Dateipfade kannst du mittels os.path.join zusammensetzen:
Re: Variableninhalt als Dateinamen verwenden?
Verfasst: Donnerstag 22. Mai 2014, 16:31
von BlackJack
@duodiscus: Vergiss am besten erst mal das es `eval()` gibt. Du willst da nur `input()` verwenden (`raw_input()` in Python 2).
Und dann musst Du den Pfad aus dem festen Teil und dem Inhalt der Variablen zusammen setzen. Das geht natürlich nicht in dem Du in die Zeichenkette einfach den Variablennamen rein schreibst. Python kann ja nicht raten was davon so wie's geschrieben ist gemeint ist und was durch Variableninhalte ersetzt werden soll.
Zeichenkettenformatierung funktioniert mit dem ``%``-Operator oder der `format()`-Methode auf Zeichenketten. Und Pfadteile sollte man mit der `os.path.join()`-Funktion zusammen setzen, denn '/' ist ja nicht überall der Pfadtrenner.
Re: Variableninhalt als Dateinamen verwenden?
Verfasst: Donnerstag 22. Mai 2014, 16:35
von duodiscus
@EyDuDanke für deine Antwort erstmal. Ich habe es so gezeigt bekommen, mit open( ... ) zu nutzen. Vielleicht liegt es daran, das dieses System sich besser für Anfänger eignet? Ich weiß es nicht.
Eval setze ich ein, damit er prüft was es für eine Eingabe ist und dieser direkt einen Typ mitgibt. In diesem Fall damit ein String übergeben wird. Okay, vllt. hier unnötig.
Code: Alles auswählen
pfad = os.path.join("/Users/Documents", name) # name steht hier also für die variable wie in meinem Fall name_person?
Ich möchte die Datei ja erstellen mit dem Namen (name_person) und danach möchte ich ja noch diverse Dinge darein schreiben. Daher soll sie ruhig geöffnet bleiben! Schließen würde ich sie nach der Aufgabe. Bisher immer gemacht mit f.close()
Re: Variableninhalt als Dateinamen verwenden?
Verfasst: Donnerstag 22. Mai 2014, 16:40
von ngulam
da war doch noch was....
Variablennamen in Englisch - sie sollen den Inhalt beschreiben
Code: Alles auswählen
pathfilename_person = os.path.join("/path/to/data", name_person)
... und die Eingabe sollte vllt. noch auf gültigen Inhalt geprüft werden ( bspw. [max.!] Länge prüfen, keinen "/" oder "\" enthalten)
Re: Variableninhalt als Dateinamen verwenden?
Verfasst: Donnerstag 22. Mai 2014, 16:45
von duodiscus
Danke BlackJack, habe es erstmal so wie bei uns vorgegeben gemacht, und es mit der Formatierung und dem % Operator gemacht. Wusste net, das der da auch so funktioniert!
Re: Variableninhalt als Dateinamen verwenden?
Verfasst: Donnerstag 22. Mai 2014, 16:49
von BlackJack
@duodiscus: `eval()` ist nicht zur überpüfung oder um „einen Typ mitzugeben”, sondern das zwingt den Benutzer dazu gültiges Python einzugeben was dann *ausgewertet* wird. Der Benutzer kann da alles mögliche eingeben, inklusive Quelltext der Dateien löscht, oder etwas am laufenden Programm ändert, was nicht für den Benutzer zu verändern vorgesehen ist. Das ist eine Sicherheitslücke und auch bei netten Benutzern schlecht robust benutzbar, weil diese Zeile, je nachdem was der Benutzer eingibt, zu so ziemlich jeder nur erdenklichen Ausnahme führen kann. `input()` gibt grundsätzlich nur die Eingabe als Zeichenkette zurück, ohne damit irgend etwas anzustellen. Ich würde `eval()` an der Stelle nicht nur als unnötig, sondern als Programmfehler ansehen.
Du kannst vor dem Schliessen ja ruhig etwas mit der Datei machen, der ``with``-Block sorgt aber dafür das sie am Ende des Blocks *auf jeden Fall* geschlossen wird, egal warum der Block verlassen wird. Das ist bei einem manuellen Aufruf von `close()` nicht garantiert. Ausser man sichert das mit einem ``try``/``finally`` ab.
@ngulam: English wäre dann aber eher `person_name` oder `persons_name`. Und prüfen auf gültigen Inhalt ist schwierig, denn was ist denn *die* maximale Länge? Und warum sollte man unter Betriebssystemen wo der Pfadtrenner der Doppelpunkt ist keine \ oder / im Namen haben? Das sollte man plattformunabhängig prüfen, beziehungsweise einfach versuchen die Datei zu öffnen. Das wird dann gegebenenfalls schon fehlschlagen.
Re: Variableninhalt als Dateinamen verwenden?
Verfasst: Donnerstag 22. Mai 2014, 17:45
von ngulam
BlackJack hat geschrieben:gültigen Inhalt ist schwierig, denn was ist denn *die* maximale Länge?
Optimal wären plattform-unabhängige Prüfungen - da gebe ich Deiner Aussage auch Recht, dass dies schwierig wird.
Für *meine* Plattform weiss ich jedoch sowohl Dateinamen-Länge und (Zitat:
"bspw" !) auch die Ungültigkeit von "\", "/" ... oder auch "\n", "\t", und "\r"
Da prüfe ich dann lieber und gebe ich ggfs. eine aussagekräftige Fehlermeldung aus.
Und zum "English": bleibe bei meiner Variante, denn der Inhalt der Variablen ist nicht "persons" oder "persons_name", sondern
Pfad- und Dateiname zur zu erstellenden Datei

Re: Variableninhalt als Dateinamen verwenden?
Verfasst: Donnerstag 22. Mai 2014, 19:25
von BlackJack
@ngulam: Sicher dass das alles Einschränkungen der Plattform sind? Was verwendest Du? DOS?
Zum Namen: Ich meinte `name_person`. Aber `pathfilename_person` hat das gleiche Problem mit der Reihenfolge.
Re: Variableninhalt als Dateinamen verwenden?
Verfasst: Freitag 23. Mai 2014, 08:41
von mutetella
EyDu hat geschrieben:Dateipfade kannst du mittels os.path.join zusammensetzen:
Wäre es nicht so besser?
Code: Alles auswählen
pfad = os.path.join(os.path.sep, 'Users', 'Documents', name)
mutetella
Re: Variableninhalt als Dateinamen verwenden?
Verfasst: Freitag 23. Mai 2014, 09:57
von snafu
mutetella hat geschrieben:Wäre es nicht so besser?
Code: Alles auswählen
pfad = os.path.join(os.path.sep, 'Users', 'Documents', name)
Naja, das hat hier das selbe Ergebnis wie das eigentlich für solche Anwendungsfälle vorgesehene `os.path.join`. Welchen Vorteil siehst du darin, das so zu machen?
BTW: Kommt Windows nicht (inzwischen?) auch mit Pfadtrennern aus der Unix-Welt klar?
Re: Variableninhalt als Dateinamen verwenden?
Verfasst: Freitag 23. Mai 2014, 11:00
von EyDu
mutetella hat geschrieben:Wäre es nicht so besser?
Code: Alles auswählen
pfad = os.path.join(os.path.sep, 'Users', 'Documents', name)
In diesem Fall ist das wohl relativ egal. Dein eingeführtes ``os.path.sep`` schafft hier übrigens mehr Probleme als Lösungen, da dies nicht unbedingt das root-Verzeichnis sein muss. Unter Unix fällt das eben "zufällig" mit dem Pfadtrenner überein, unter Windows ist die Angabe falsch. Wenn man es ganz systemunabhängig haben will, dann muss man eben noch mehr drum herum basteln. Da hatte ich einfach keine Lust drauf.
Re: Variableninhalt als Dateinamen verwenden?
Verfasst: Freitag 23. Mai 2014, 12:16
von mutetella
snafu hat geschrieben:Welchen Vorteil siehst du darin, das so zu machen?
Ich dachte halt, dass u. a. das plattformunabhängige Setzen der Pfadtrenner mit der Grund ist, `os.path.join()` zu verwenden und die Übergabe von "hart gesetzten" Pfadtrennern dies wieder ad absurdum macht.
mutetella