Einfache Sache...oder nicht!?

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.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Freitag 14. April 2006, 19:37

habe einen kleinen skript, mein erster.
der will aber nicht! konnte keinen vergleichbaren finden.

Code: Alles auswählen

#!/usr/bin/env python
import sys
print("Bitte gebe den Namen mit dateiendung an: (funktioniert nur im gleichen Ordner)")
input=sys.stdin.readline()
input=input.strip()
print("Du hast die Datei %s aufgewaehlt") % (input)
fd=open('%s', 'w') %input
inhalt=fd.read()
fd.close
print inhalt
sys.stdin.readline()
fehlermeldung:
Bitte gebe den Namen mit dateiendung an: (funktioniert nur im gleichen Ordner)
hier.txt
Du hast die Datei hier.txt aufgewaehlt
Traceback (most recent call last):
File "./ausgabekonsole.pyw", line 7, in ?
fd=open('%s', 'w') %input
TypeError: unsupported operand type(s) for %: 'file' and 'str'
icepacker
User
Beiträge: 49
Registriert: Dienstag 15. November 2005, 18:48

Freitag 14. April 2006, 19:47

Hi

Code: Alles auswählen

#!/usr/bin/env python
import sys
print("Bitte gebe den Namen mit dateiendung an: (funktioniert nur im gleichen Ordner)")
input=sys.stdin.readline()
input=input.strip()
print("Du hast die Datei %s aufgewaehlt") % (input)
fd=open(input, 'w+')  # einfach die variable einsetzen
# und w+ benutzen um schreiben und lesen zu können
inhalt=fd.read()
fd.close
print inhalt
sys.stdin.readline() # was soll das hier?
lg icepacker
ubuntu linux !!
Benutzeravatar
Kolazomai
User
Beiträge: 33
Registriert: Donnerstag 16. Februar 2006, 15:05
Kontaktdaten:

Freitag 14. April 2006, 19:49

Hi,

warum so umständlich ? Es soll ja auch raw_input geben :P

Code: Alles auswählen

datei = raw_input("Bitte geb die Datei an oder den Pfad zur Datei: ")
print "Du hast die Datei",datei,"ausgewählt!"
f = open(datei,"r")
inhalt = f.read()
f.close()
print inhalt
raw_input("Press any key to exit ...")
Mfg,

Kolazomai
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Freitag 14. April 2006, 20:00

warum so umständlich? weils im tuto*ichweissnichwiedaswortweitergeht*
so stand. was ist denn der unterschied zwischen raw_input un meiner variante?
@ersteantwort:
um das fenster geöffnet zu lassen, ist der letzte, laut tutowasweißich zumindest
@zweiteantwort: die verson klappt, bei der anderen schreibe ich das textdokument namens "inhalt"...
Benutzeravatar
Kolazomai
User
Beiträge: 33
Registriert: Donnerstag 16. Februar 2006, 15:05
Kontaktdaten:

Freitag 14. April 2006, 20:06

murph hat geschrieben:warum so umständlich? weils im tuto*ichweissnichwiedaswortweitergeht*
so stand. was ist denn der unterschied zwischen raw_input un meiner variante?
@ersteantwort:
um das fenster geöffnet zu lassen, ist der letzte, laut tutowasweißich zumindest
Hi,

es gibt praktisch gar keinen Unterschied. Normal nimmt man das sys.stdin.readline() um z.B. System-Cmds auszuführen, soweit ich das weiss :) raw_input ist auf jeden Fall der einfachere und sichere Weg. Für was gibts sonst die Funkion. Ausserdem musst du dafür nicht mal sys importieren.

Kommst du zufällig aus C und hast dich an Python "gewagt" ? Weil normal braucht man die % - Sachen nicht, sondern kann einfach nur die Variable hinschreiben.

Mit diesem Tutorial hab ichs gelernt. Das ist am Anfang zwar etwas langweilig, aber sonst alles gut und einfach erklärt.

Mfg,

Kolazomai
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Freitag 14. April 2006, 20:36

ich komme von php und war türlich variablenverwöhnt^^
bei der umstellung hab ich ganz auf tutorial vertraut...
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Sonntag 16. April 2006, 14:27

Der Vollständigkeit halber:
murph hat geschrieben:

Code: Alles auswählen

fd=open('%s', 'w') %input
Was du meintest, war

Code: Alles auswählen

fd = open('%s' % input, 'w')
Das % folgt direkt nach dem String.
Wie schon erwähnt, ist das aber sinnlos.

Gedacht ist es für Dinge wie

Code: Alles auswählen

print "Die Zahl foo ist %i. Der String bar ist %s" % (foo,bar)
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Sonntag 16. April 2006, 18:45

könnt ihr mir sagen, wann das sinnvoll ist? die ausführliche schreibweise mein ich.
auf mich wirkt sie sehr unübersichtlich.
BlackJack

Montag 17. April 2006, 07:46

murph hat geschrieben:könnt ihr mir sagen, wann das sinnvoll ist? die ausführliche schreibweise mein ich.
auf mich wirkt sie sehr unübersichtlich.
Was meinst Du jetzt mit ausführlicher Schreibweise? Das hier:

Code: Alles auswählen

print "Die Zahl foo ist %i. Der String bar ist %s." % (foo,bar)
Das ist doch weniger ausführlich als das äquivalente:

Code: Alles auswählen

print "Die Zahl foo ist " + str(int(foo)) + ". Der String bar ist " + str(bar) + "."
Ein weiterer Vorteil ist, dass man in der ersten Variante eine Zeichenkette hat, die man zum Beispiel auch aus einer Datei einlesen kann. Zum Beispiel um die Anwendung flexibel auf mehrere Sprachen einzustellen.

Und man kann bei den Format-Platzhaltern auch noch diverse Formatierungen angeben. Führende Nullen bei Zahlen, maximallänge, rechtsbündig und so weiter.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 17. April 2006, 08:03

murph hat geschrieben:die ausführliche schreibweise mein ich. auf mich wirkt sie sehr unübersichtlich.
Hi murph!

Falls du so etwas meinst:

Code: Alles auswählen

print "Name: %s -> %i" % (person_name, person_alter)
Das wurde von C geerbt. Wahrscheinlich hat es dem Entwickler von Python so gut gefallen, dass er es übernommen hat. Außerdem passt es in das Grundprinzip von Python "Explizit ist besser als inplizit". In die Zeichenkette wird nur dann ein Wert eingefügt, wenn dieser nach dem % angehängt wird. So werden unabsichtliche Ersetzungen vermieden.

Wenn es dir egal ist und du das Risiko trotzdem eingehen möchtest, was nicht immer schlecht ist, dann kannst du es auch so schreiben:

Code: Alles auswählen

person_name = "Gerold"
person_alter = 31
print "Name: %(person_name)s -> %(person_alter)i" % locals()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Montag 17. April 2006, 18:37

da scheint python sehr viele freiheiten zu lassen.
es sollte aber auch das hier gehen, oder nicht?

Code: Alles auswählen

>>>person_name="gerold"
>>>person_alter="31"
>>>print "Name: "person_name"->"person_alter
                                                            ^
nein, es geht nicht, ein sytaxfehler! hat das einen einfachen hintergrund
oder wäre die erklärung bei den pythonentwicklern zu erfragen?
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 17. April 2006, 18:44

murph hat geschrieben:

Code: Alles auswählen

>>>print "Name: "person_name"->"person_alter
Mit Komma geht's:

Code: Alles auswählen

person_name = "Gerold"
person_alter = 31
print "Name:", person_name, "->", person_alter
Aber die Sting-Operator Geschichte ist auf dauer viel übersichtlicher...

In dem Zusammenhang interessiert dich vielleicht auch das:
[wiki]Multiline Strings[/wiki]

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 17. April 2006, 18:46

murph hat geschrieben:nein, es geht nicht, ein sytaxfehler! hat das einen einfachen hintergrund oder wäre die erklärung bei den pythonentwicklern zu erfragen?
Hi murph!

???

Einfach irgendetwas hinschreiben wird nicht funktionieren. Man muss sich schon an die Vorgabe der Programmiersprache halten. Das hier funktioniert:

Code: Alles auswählen

>>> person_name = "gerold"
>>> person_alter = "31"
>>> print "Name:", person_name, "->", person_alter
Name: gerold -> 31
>>> 
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 17. April 2006, 18:48

Ich war schneller :lol:

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

Montag 17. April 2006, 18:51

es gibt aber noch sone lustig-niedliche sache:

wenn man

Code: Alles auswählen

print ("Hallo " "Welt" "!")
zb. schreibt, erkennt er es immernoch als ein-einzigen
string an...
geht aber nur dann, wenn gerade eben KEINE kommata gesetzt sind...
[size=85]"Unsere Situation ist immer die eines schwarzen Mannes der in einem schwarzen Keller einen schwarzen Hut sucht, den es vielleicht gar nicht gibt." Sir Karl R. Popper[/size]
Antworten