Abspeichern in ein Modul

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.
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

Hi, ich habe ein Problem mit dem Abspeichern von mehr als einer Variable in ein Modul. Ich möchte Zahlen und Wörter(als Zeichenkette) abspeichern. Bei den Zahlen funktioniert das auch:

Code: Alles auswählen

import os
import Speicherung #das Speichermodul
zahl=input('Welche Zahl wollen sie speichern?')
os.remove(os.getcwd()+os.sep+'Speicherung.pyw')
os.system('echo zahl='+str(zahl)+'>Speicherung.pyw')

Code: Alles auswählen

a=Speicherung.zahl
print zahl
Wenn ich das ganze für Zeichenketten machen , habe ich Probleme bei dem Laden.

Code: Alles auswählen

wort=raw_input('Welches Wort wollen sie speichern?')
os.remove(os.getcwd()+os.sep+'Speicherung.pyw')
os.system('echo wort='+('wort')+'>Speicherung.pyw')
Danach findet man das Wort in dem Modul, aber nicht als String. Im Speichermodul sieht es dann so aus:

Code: Alles auswählen

wort=abc
Nun kann ich es aber nicht importieren, da mir Python sagt, dass
"name 'abc' is not defined" ist. Was muss ich ändern?

Meine zweite Frage:

Mit dieser Methode lässt sich nur eine Variable abspeichern. Ich muss aber mind. 10 für ein Projekt abspeichern, da die Variable 'wort' bzw. 'zahl' immer überschrieben wird, so dass am Ende das Modul zur Speicherung nur eine Zeile hat. Kann jemand helfen?
lunar

Damit die Anführungszeichen in der Datei gespeichert werden, müsstest du in der gegenwärtigen Form 3 drei Anführungszeichen um das Wort setzen. Die ersten für Python, die zweiten für die Shell und die dritten schaffen es dann tatsächlich in die Datei.

Allerdings würde ich dir vorschlagen, erstmal das Tutorial zu lesen, und dem Umgang mit Dateien zu lernen, denn was du da mit "os.system()" machst, ist - gelinde gesagt – grausam.

So sieht das richtig aus:

Code: Alles auswählen

text = raw_input('Welchen Text wollen Sie speichern?')
with open('Speicherung.pyw', 'w') as stream:
    stream.write('word=')
    stream.write(repr(text))
    stream.write('\n')
Nach dem Sinn dieses Vorhabens traue ich mich gar nicht zu fragen ...
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

with open('sicherung.pyw', 'ab') as f:
    f.write('wort='+repr(wort)+'\n')
Das fügt für jedes Wort eine weitere Zeile in Datei sicherung.pyw dazu.

Falls du noch Python 2.5 nutzt, musst du vorher nen Import machen, damit er "with" richtig interpretiert:

Code: Alles auswählen

from __future__ import with_statement
Was hast du eigentlich mit diesem "Modul" vor?

EDIT: Überschneidung mit Lunar, da ich am Schreiben war als sein Beitrag abgesendet wurde.
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

Es ist für ein Informatikprojekt welches wir in der 10. Klasse schreiben müssen. Worum es inhaltlich genau geht weiß ich noch nicht wirklich, dafür ist mein Partner verantwortlich.

In dem Programm soll es eine Speicherfunktion geben und ich habe etwas mit "os" herumgespielt und kam dann auf diesen Weg zu speichern.

Gibt es noch andere Wege zu speichern, zB über Datenbanken?
lunar

In der Dokumentation findest du alle möglichen Module zum Speichern von Daten.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Hier ist eine Sammlung von Möglichkeiten die Gerold mal zusammengetragen hat:
http://www.python-forum.de/topic-6157.html
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Boldi hat geschrieben:Gibt es noch andere Wege zu speichern, zB über Datenbanken?
Das z.B.: http://docs.python.org/library/sqlite3.html

Aber für deine 10 Strings, die du an irgendwelche Namen bindest, wirst du dich wohl kaum mit sowas auseinandersetzen müssen.
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn dein Partner ebenfalls mit Python auf die Daten zugreift, ist wahrscheinlich shelve etwas für euch: http://docs.python.org/library/shelve.html
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

Danke für die ganzen Links :D Damit wäre ein Problem gelöst.
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

@ lunar: Danke dein Version funktioniert perfekt. Mit Zahlen muss das dann so aussehen, oder:

Code: Alles auswählen

zahl = input('Welche Zahl wollen Sie speichern?')
with open('Speicherung.pyw', 'w') as stream: #aber was soll für das "w"
    stream.write('zahl=')                               #eingesetzt werden?
    stream.write(repr(zahl))
    stream.write('\n')
@snafu: Wie muss man anwenden? Wenn man den Quelltext von lunar nimmt? Hat sich geklärt
Zuletzt geändert von Boldi am Montag 29. Dezember 2008, 14:11, insgesamt 1-mal geändert.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

input interpretiert die Eingabe als Python Code, sowas sollte man nicht nutzen. Stattdessen solltest du den String, den raw_input zurückliefert, in eine Zahl umwandeln.

Code: Alles auswählen

a = "5"
a = int(a)
"w" ist natürlich der Parameter für ein Dateiobject, der festlegt, wie man mit einer Datei umgehen will. "w" steht für "write", also zum Schreiben öffnen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Oh graus, die Idee direkt im Programm in Quelltextdateien zu schreiben ist so fürchterlich, das wäre ich mir auch als Anfänger wohl nie im Leben eingefallen. Das ist definitiv die schlechteste Idee die ich diesen Monat hier im Forum gesehen habe. :shock: Und euer Informatiklehrer hat euch das so gesagt? :evil:

Zum Speichern von Daten gibt es Datenbanken oder spezielle Formate zum Speichern von Daten wie XML, Pickle, JSON, etc.

Übrigens: In Python 2.x solltest du _immer_ ``raw_input`` nutzen und das ``w`` steht für ``write`` und das musst du nicht ändern, wenn du in eine Datei speichern willst.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Boldi hat geschrieben:@snafu: Wie muss man anwenden? Wenn man den Quelltext von lunar nimmt?
Wie muss man _was_ anwenden? Worauf beziehst du dich jetzt? Falls es um Shelve geht, würde man die Werte wie in einem Dictionary übergeben.
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

Ok das war schlecht formuliert. Ich meine das:

Code: Alles auswählen

with open('sicherung.pyw', 'ab') as f:
    f.write('wort='+repr(wort)+'\n')
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Leonidas hat geschrieben:Oh graus, die Idee direkt im Programm in Quelltextdateien zu schreiben ist so fürchterlich, das wäre ich mir auch als Anfänger wohl nie im Leben eingefallen. Das ist definitiv die schlechteste Idee die ich diesen Monat hier im Forum gesehen habe. :shock: Und euer Informatiklehrer hat euch das so gesagt? :evil:
Ach wieso? Sowas ist bei PHP gang und gäbe ;)
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Auch auf die Gefahr hin, dass wir aneinander vorbeireden, mit Shelve würde man das so machen:

Code: Alles auswählen

>>> import shelve
>>> name = raw_input('Gib deinen Namen ein: ')
Gib deinen Namen ein: Sebastian
>>> age = raw_input('Gib dein Alter ein: ')
Gib dein Alter ein: 25
>>> slv = shelve.open('data.slv')
>>> slv['name'] = name
>>> slv['age'] = age
>>> slv.close()
Und wenn dein Kollege es später wieder auslesen will...

Code: Alles auswählen

>>> slv = shelve.open('data.slv')
>>> print slv['name']
Sebastian
>>> print slv['age']
25
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

Leonidas hat geschrieben:Oh graus, die Idee direkt im Programm in Quelltextdateien zu schreiben ist so fürchterlich, das wäre ich mir auch als Anfänger wohl nie im Leben eingefallen. Das ist definitiv die schlechteste Idee die ich diesen Monat hier im Forum gesehen habe. :shock: Und euer Informatiklehrer hat euch das so gesagt? :evil:

Zum Speichern von Daten gibt es Datenbanken oder spezielle Formate zum Speichern von Daten wie XML, Pickle, JSON, etc.

Übrigens: In Python 2.x solltest du _immer_ ``raw_input`` nutzen und das ``w`` steht für ``write`` und das musst du nicht ändern, wenn du in eine Datei speichern willst.
Das hat mir niemand gesagt, dass ist alles auf meinem Mist gewachsen :wink: Natrlich könnten wir auch Datenbanken nutzen, allerdings lohnt sich der Aufwand nicht. Es so zu machen wie es mir von snafu und lunar erklärt wurde reicht vollkommen aus.

Thread kann geschlossen werden. Mein Versuch funktioniert dank alles die mir Tipps gegeben haben fehlerfrei.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mit pickle wäre das noch einfacher und trotzdem sauber.

Code: Alles auswählen

import pickle
daten = [['haus', 'hase'], [1, 2, 3, 4]]
fobj = open('save.dat', 'w')
pickle.dump(daten, fobj)
fobj.close()
Laden geht übrigens ebenso einfach. Shelve wurde auch bereits erwähnt, das ebenso eine bessere Lösung als Module schreiben ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Ich hatte mal nen PHP-Script, das nen Template für nen Python Modul war :D
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

snafu hat geschrieben:Auch auf die Gefahr hin, dass wir aneinander vorbeireden, mit Shelve würde man das so machen:

Code: Alles auswählen

>>> import shelve
>>> name = raw_input('Gib deinen Namen ein: ')
Gib deinen Namen ein: Sebastian
>>> age = raw_input('Gib dein Alter ein: ')
Gib dein Alter ein: 25
>>> slv = shelve.open('data.slv')
>>> slv['name'] = name
>>> slv['age'] = age
>>> slv.close()
Und wenn dein Kollege es später wieder auslesen will...

Code: Alles auswählen

>>> slv = shelve.open('data.slv')
>>> print slv['name']
Sebastian
>>> print slv['age']
25
Ich glaub wir haben wirklich aneinander vorbeigeredet :wink: aber das war wenn mein Fehler.
Danke für deine Hilfe, ich glaube diese Version ist sogar noch besser als die erste.
Antworten