Anfängerproblem mit Dateifunktionen

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
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

Hi.
Hab mal wieder ein klassisches Anfängerproblem. Ich wollte mir Funktionen für die Datei Ein- und Ausgabe machen, aber irgendwie will das nicht so wie es soll. Ich finde einfach meinen Fehler nicht.

Code: Alles auswählen


def writefile(inhalt,filename):
    link = file(filename, 'w')
    link.write(inhalt)
    link.close()
    return True

def readfile(filename):
    link = file(filename)
    inhalt = link.read()
    return inhalt
Ich wäre euch wirklich dankbar wenn ihr den Fehler finden würdet. Gruß sprudel
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Hi,

- ersetze ``file`` mit ``open``
- schreib auch bei deinem readfile "open(filename, 'r')"

Sind beides nur Tipps, keine Fehler im code.

Beim aufrufen von einem Pfad (bei Windows) keine \ (Backspace) nutzen
sondern / (Schrägstrich).

Code: Alles auswählen

def write_file(inhalt,filename):
    link = open(filename, 'w')
    link.write(inhalt)
    link.close()
    return True

def read_file(filename):
    link = open(filename, 'r')
    inhalt = link.read()
    return inhalt

print write_file("lol2lol","data.txt") # schreibt data.txt in ordner wo die py datei liegt
print read_file("data.txt") # funzt auch; daten werden aus data.txt gelsen
Dein Code funktioniert so wie er gepostet wurde
Wenn ich nicht geholfen habe kompletten Code und Fehlermeldung schicken.

mfG Sr4l
BlackJack

Nach dem lesen sollte man die Datei auch wieder schliessen.

Was ist denn genau das Problem? Fehlermeldung?
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Code: Alles auswählen

x = readfile('/etc/passwd')
Dann Close FileObjekt verwenden :!:

Code: Alles auswählen

writefile(x, '/tmp/test')
y = readfile('/tmp/test')
scheint alles da zu sein :D
Test nicht vergessen, ob Lesen, Schreiben erfolgreich war :!:
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Sr4l hat geschrieben:- ersetze ``file`` mit ``open``
Warum sollte man das tun??? Ist beides das selbe!

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:

Sr4l hat geschrieben:- ersetze ``file`` mit ``open``
Hi Sr4l!

Was soll das bringen? Ich arbeite nur mit ``file`` da mir der Name sofort sagt, was ich da zurück bekomme. -- Ein File-Object! Im Grunde genommen steht es doch jedem frei, ``file`` oder ``open`` zu verwenden.

@sprudel: Vielleicht hast du auch nur die Parameter beim Aufruf vertauscht.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Ihr werdet sehen was ich davon habt :twisted:

Nein mal im ernst ich nehme immer open weil ich es öffne. Ich ziehe es zurück und sage nehmt was ihr wollt ;-)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

`open` kann man insofern als passender sehen, weil zum Einen Funktionen immer nach Verben benannt werden sollten, zum Anderen file eine Klasse ist (die man auch zur Typprüfung heranziehen kann), aber Klassennamen laut PEP 8 mit einem Großbuchstaben beginnen sollten -> kann verwirrend sein.

Ob file() nun den Konstruktor oder __call__ aufruft, weiß ich so nicht, dürfte für den Benutzer aber auch egal sein - und da das meines Wissens in C implementiert ist, gibt es __call__ dort so vielleicht auch gar nicht.

Letztlich ist wichtig, dass man weiß, was gemeint ist und dass man es konsequent einheitlich verwendet. Wirklich *drastische* Argumente pro/contra open/file habe ich mal gesucht, seinerzeit aber nicht gefunden und auch bis heute nicht. Aber ich bin ganz Ohr :)
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Open / Close halte ich für sinnvoll. Wenn ich etwas öffne, sollte ich es auch schließen und es ist in vielen Sprachen gebräuchlich. Für mich explizit :)
BlackJack

Der BDFL bevorzugt `open()` zum öffnen von Dateien. Braucht man mehr Gründe? ;-)

Es war mal im Gespräch, dass `open()` so erweitert werden könnte, dass man irgendwo Protokolle registrieren kann, damit sich nicht nur lokale Dateien mit der Funktion öffnen lassen. Da das nicht rückwärtskompatibel ist, dürfte das aber erst in P3K möglich sein. Keine Ahnung was aus der Diskussion geworden ist.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

BlackJack hat geschrieben:Der BDFL bevorzugt `open()` zum öffnen von Dateien. Braucht man mehr Gründe? ;-)

Es war mal im Gespräch, dass `open()` so erweitert werden könnte, dass man irgendwo Protokolle registrieren kann, damit sich nicht nur lokale Dateien mit der Funktion öffnen lassen. Da das nicht rückwärtskompatibel ist, dürfte das aber erst in P3K möglich sein. Keine Ahnung was aus der Diskussion geworden ist.
Protokolle? Wie meinst du das?
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
BlackJack

Na das sowas wie `open('http://www.heise.de/')` oder `open('zip:spam.zip/some/file/within/archive.txt')` möglich ist. Und das es ähnlich wie bei den `codecs` eine Möglichkeit gibt, eigene Protokolle zu registrieren.
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

Hallo.
Also ich habe es jetzt foglendermaßen verändert, bekomme aber immer noch eine Fehlermeldung

Code: Alles auswählen

def writefile(inhalt,filename):
    link = open(filename, 'w')
    link.write(str(inhalt))
    link.close()
    return True

def readfile(filename):
    link = open(filename)
    inhalt = link.read()
    link.close()
    return inhalt

Traceback (most recent call last):
File "G:\Programmierung und Entwicklung\Python\Zähler\counter.py", line 68, in <module>
filemodule.writefile(count,logfilename_now)
File "G:\Programmierung und Entwicklung\Python\Zähler\filemodule.py", line 11, in writefile
link.write(str(inhalt))
TypeError: argument 1 must be string or read-only character buffer, not int
>>>



Woran könnte das liegen?
BlackJack

Du hast nicht zufällig den Namen `str` an eine Funktion gebunden, die eine Zahl zurückgibt?

Mach doch direkt vor der Fehlerstelle mal:

Code: Alles auswählen

    print type(str), repr(str)
    print type(inhalt), repr(inhalt)
Mal so nebenbei: Warum gibt die Funktion `True` zurück?
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

Wegen dem True ausgeben: Hab ich wohl noch von PHP so übernommen, sry :lol:

Aber jetzt kapier ich garnichts mehr

Code: Alles auswählen

def writefile(inhalt,filename):
    link = open(filename, 'w')
    link.write(str(inhalt))
    link.close()
    return True

def readfile(filename):
    link = open(filename)
    inhalt = link.read()
    link.close()
    return inhalt

print type(str), repr(str)
print type(inhalt), repr(inhalt)

Gibt folgende Ausgabe:

<type 'type'> <type 'str'>
Traceback (most recent call last):
File "G:\Programmierung und Entwicklung\Python\Zähler\filemodule.py", line 22, in <module>
print type(inhalt), repr(inhalt)
NameError: name 'inhalt' is not defined
>>>


Was hat das denn zu bedeuten?
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Ich würde Dir http://www.python-forum.de/topic-6157.html ans Herz legen. An weiteren Spekulationen beteilige ich mich nicht, bevor Du den vollständigen Code zeigst.
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

sprudel hat geschrieben: <type 'type'> <type 'str'>
Traceback (most recent call last):
File "G:\Programmierung und Entwicklung\Python\Zähler\filemodule.py", line 22, in <module>
print type(inhalt), repr(inhalt)
NameError: name 'inhalt' is not defined
>>>


Was hat das denn zu bedeuten?
PmanX hat recht, mit mehr Code wäre es deutlich einfacher, dir zu helfen.

Aber zu der Fehlermeldung: DIe ist ziemlich eindeutig, an dem Punkt, wo du auf 'Inhalt' zugreifst, ist es nicht definiert. DU benutzt den Namen innerhalb der Funktionen 'writefile' und readfile, ausserhalb sind sie nicht definiert soweit man das deinem Code entnehmen kann (alles sehen wir ja nicht...).
Pack die beiden prints bitte in die Funktion writefile, direkt vor den Punkt an dem in die Datei geschrieben werden soll (da interessiert uns ja, was das für Typen sind, weil da der Fehler passiert).
Antworten