Newbie:Inhalt eine txt Datei als Liste zu speichern

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
kampfDemError
User
Beiträge: 5
Registriert: Donnerstag 13. Dezember 2007, 00:59

Donnerstag 13. Dezember 2007, 01:27

Hallo zusammen,

Ich habe folgendes Problem:
habe ein txt.Datei mit diesem Inhalt:

["String1","String2","String3"]

nun möchte ich zum Beispiel nur "String2" ausgeben lassen.
Habe diese kurze Script, aber komme damit leider nicht weiter.

Code: Alles auswählen

pfad = "meinVerzeichnis" 
dateiname="text.txt"
datei = pfad+dateiname
in_file = open(datei,"r")
liste = in_file.read()

in_file.close()

print liste[1]
wenn ich folgendes tue, klappt das
mit der richtigen Ausgabe:

Code: Alles auswählen

liste=["String1","String2","String3"]
print liste[1]

Wo liegt mein Fehler?
Wuerde mich ueber einen Tip freuen.

Lg

Daniel
BlackJack

Donnerstag 13. Dezember 2007, 08:19

In der Textdatei steht keine Liste sondern eine Zeichenkette. Einfachste Lösung ist es, die da nicht so rein zu schreiben, sondern zum Beispiel das `csv`-Modul zu benutzen, um eine oder mehrere Listen in eine Datei zu schreiben und wieder zu lesen.
Pablo Escobar
User
Beiträge: 21
Registriert: Montag 12. November 2007, 15:15
Wohnort: Stuttgart

Donnerstag 13. Dezember 2007, 08:20

ich bin ja kein python spezialist
aber wenn du:

Code: Alles auswählen

liste = in_file.read()
machst, sollte liste ein string sein
sprich du müsstest liste noch mal splitten

also mein vorschlag wäre die änderung:

Code: Alles auswählen


in_file = open(datei,'r')
contents = in_file.read()
liste = contents.split()
print liste[1]


dann sollte das ganze klappe

edit:
wenn du mein beispiel nimmst musste deine txt noch leicht verändern
anstatt ["string1","string2","string3"]
machste string1 string2 string3
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Donnerstag 13. Dezember 2007, 08:31

Guten Morgen Daniel,
kampfDemError hat geschrieben:Hallo zusammen,

Ich habe folgendes Problem:
habe ein txt.Datei mit diesem Inhalt:

["String1","String2","String3"]

nun möchte ich zum Beispiel nur "String2" ausgeben lassen.
Habe diese kurze Script, aber komme damit leider nicht weiter.

Code: Alles auswählen

pfad = "meinVerzeichnis" 
dateiname="text.txt"
datei = pfad+dateiname
in_file = open(datei,"r")
liste = in_file.read()

in_file.close()

print liste[1]
Hast du dir mal "liste" ausgeben lassen? Da sieht man recht schnell, warum es nicht funktioniert:

Code: Alles auswählen

[Programme\Console]|9> liste = in_file.read()                  
[Programme\Console]|10> liste                                  
                   <10> '["String1","String2","String3"] \n'  

Du musst in der Textdatei die Strings nicht schon als Liste eingeben, um dann eine Liste daraus zu machen.

Wenn in der Textdatei einfach : String1, String2, String 3 steht, sieht das alles folgender Maßen aus:

Code: Alles auswählen

[Programme\Console]|16> in_file = open(datei,"r")      
[Programme\Console]|17> liste = in_file.read()         
[Programme\Console]|18> liste                          
                   <18> 'String1,String2,String3 \n'   
[Programme\Console]|26> liste_neu= liste.strip(" \n")       
[Programme\Console]|27> liste_neu                           
                   <27> 'String1,String2,String3'           
[Programme\Console]|28> liste_fertig = liste_neu.split(",") 
[Programme\Console]|29> liste_fertig                        
                   <29> ['String1', 'String2', 'String3']   
Hoffe, dass hilft die irgendwie weiter.
Wenn du die Form, wie es in der Text-Datei steht, aber nicht ändern kannst, musst halt die [] entfernen. Du brauchst die Strings in der Textdatei auch nicht extra noch in "" schreiben, da sie eh als Strings gelesen werden.

EDIT: ups, da war ich wohl zu langsam.
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Donnerstag 13. Dezember 2007, 09:32

.read() ist für deinen Ansatz vielleicht nicht ganz das richtige. Schau mal hier, vielleicht findest du da was brauchbares ... Natürlich müßte die Datei entsprechend präpariert sein ...
kampfDemError
User
Beiträge: 5
Registriert: Donnerstag 13. Dezember 2007, 00:59

Donnerstag 13. Dezember 2007, 11:01

Hallo,

vielen dank für die antworten.
Ich hoffe ich komme jetzt damit weiter.
Die txt dateien kann ich leider nicht verändern.

Besten Gruss

Daniel
schueler
User
Beiträge: 8
Registriert: Mittwoch 30. Mai 2007, 10:24

Donnerstag 13. Dezember 2007, 11:06

kampfDemError hat geschrieben:

Code: Alles auswählen

pfad = "meinVerzeichnis" 
dateiname="text.txt"
datei = pfad+dateiname
in_file = open(datei,"r")
Soweit stimmt ja noch alles. Für den Weg danach ein paar Tipps

Am besten speicherst du deine strings anders und suchst dir ein einheitliches Trennzeichen, zB '#' also String1#String2#String3

Und dann würde ich am einfachsten das ganze über eine Iteration starten.

Code: Alles auswählen

liste=[]

a=in_file.readlines()

for b in a:
          d,e,f=b.split('#')
          f=f.strip()
          liste.append(d)
          liste.append(e)
          liste.append(f)

print liste[1]
einfacher wird es natürlich, wenn du nach jedem satz einen Absatz machst, da du dir dann das splitten sparst. Dann musst du lediglich strippen und hast immer nur ein Argument, das du appenden musst.

Mfg ich
Women are ment to be loved not understood.

- Oscar Wilde
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Donnerstag 13. Dezember 2007, 15:01

Mit "eval" würde man bei dem Dateiformat auch gut vorankommen *duck*
BlackJack

Donnerstag 13. Dezember 2007, 15:21

*steinwerf* Ach mist, er hat sich ja geduckt. :-)
kampfDemError
User
Beiträge: 5
Registriert: Donnerstag 13. Dezember 2007, 00:59

Freitag 14. Dezember 2007, 09:28

Hallo zusammen,

danke nochmal für die zahlreichen tips.
Ich habe ein paar sachen ausprobiert.
Eine Frage hätte ich noch:

Wenn ich eine txt datei mit einer Liste habe, zum Beispiel in der Form:

Code: Alles auswählen

[[0,["String","test"],[0,["String","test"]]
gibt es da eine eine Möglichkeit das auszulesen, so dass es direkt als Liste erkannt wird? So etwas wie readlines() für Listen?
Ich habe das CSV Modul ausprobiert, hatte aber keinen Erfolg damit.

Schönen Tag

Daniel
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 14. Dezember 2007, 09:50

kampfDemError hat geschrieben:

Code: Alles auswählen

[[0,["String","test"],[0,["String","test"]]
Hallo Daniel!

Fehlen da zwei Klammern?

Falls ja:

Code: Alles auswählen

>>> import simplejson # http://cheeseshop.python.org/pypi/simplejson
>>> s = """[[0,["String","test"],[0,["String","test"]]]]"""
>>> simplejson.loads(s)
[[0, [u'String', u'test'], [0, [u'String', u'test']]]]
>>> 
Das geht auch mit deiner ersten Frage:

Code: Alles auswählen

>>> s = """["Hallo", "Welt"]"""
>>> my_list = simplejson.loads(s)
>>> my_list[0]
u'Hallo'
>>> my_list[1]
u'Welt'
>>> 
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
kampfDemError
User
Beiträge: 5
Registriert: Donnerstag 13. Dezember 2007, 00:59

Freitag 14. Dezember 2007, 10:34

das probiere ich gleich aus
super vielen dank

lg
Daniel
kampfDemError
User
Beiträge: 5
Registriert: Donnerstag 13. Dezember 2007, 00:59

Freitag 14. Dezember 2007, 11:44

Hallo zusammen,

simplejson hat mein problem gelöst.
das sieht jetzt so aus:

Code: Alles auswählen

import simplejson
pfad = "meinVerzeichnis"
dateiname="meineDatei"
datei = pfad+dateiname
in_file = open(datei,"r")
liste = in_file.read()
in_file.close()
neueListe=simplejson.loads(liste) 
print neueListe
Vielen Dank und liebe Grüße

Daniel
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 14. Dezember 2007, 16:09

Um Pfade und Dateinamen zu verketten nimmt man `os.path.join`, das setzt die entsprechenden Trennzeichen (Doppelpunkt, Slash, Backslash) automatisch und richtig.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten