Liste aus Datei importieren

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
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

Hallo,

ich habe eine Liste in der Form, s = [12, 356, 678,456].
Nun möchte ich diese Liste aus einer externen txt-Datei importieren und genau so wie vorher weiterverwenden.
D.h. über eine Schleife: for n in s:.

Hat jemand eine Idee?

Daniel
BlackJack

@Duesentrieb: Schau Dir mal das JSON-Format und das `json`-Modul in der Standardbibliothek an.
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

Danke für deine schnelle Antwort.
Ich habe mal versucht mich über json zu informieren. Leider nicht ganz einfach für einen Anfänger.

Ich will mein Problem mal etwas genauer beschreiben.
Mit der folgenden Abfrage hole ich mir einen String aus der externen Datei:

Code: Alles auswählen

# Dateizugriff
try:
    d = open("HIS_Data.txt")
except:
    print("Dateizugriff nicht erfolgreich")
    sys.exit(0)

# erster Wert
zeile0 = d.readline()
print wert1[0:len(wert1)-1]
s1 = wert1[0:len(wert1)-1]
# zweiter Wert
zeile1 = d.readline()
print wert2[0:len(wert2)-1]
s2 = wert2[0:len(wert2)-1]
Wie müsste ich das auf json anpassen?
BlackJack

Mit dem Quelltext holst Du *zwei* Zeichenketten aus einer Datei, aber was hat das jetzt mit der ursprünglichen Frage zu tun?

Anmerkungen zu dem Quelltext: Ein nacktes ``except:`` ohne Angabe der tatsächlich erwarteten Ausnahme(n) ist fast nie eine gute Idee. Damit verdeckt man gerne mal Fehler/Ausnahmen die man nicht erwartet hat, und wo man dann auch nicht so einfach heraus findet wo der der Fehler liegt, weil man die Ausnahme nie zu Gesicht bekommt, sie aber von Code behandelt wird, der dazu nicht passt.

Speziell in diesem Fall ist das ``try``/``except`` auch unnötig weil ohne dieses Konstrukt auch das Programm mit einer entsprechenden Meldung abgebrochen wird. Man hat also nichts gewonnen, nur den Traceback verloren der auf die Programmzeile hinweist wo das Problem aufgetreten ist.

Dateien die man öffnet, sollte man auch wieder schliessen. Dateideskriptoren sind keine unendlich vorhandene Ressource. Dazu bietet sich die ``with``-Anweisung an.

Namen sollen dem Leser vermitteln was die Werte die daran gebunden sind, im Kontext des Programms bedeuten. `d` tut das sicherlich nicht.

Wenn man anfängt Namen durchzunummerieren, ist das in der Regel ein Zeichen das man keine Einzelnamen haben möchte, sondern eine Datenstruktur. Oft eine Liste.

`zeile0` und `zeile1` werden definiert, aber nirgends verwendet, dafür werden `wert1` und `wert2` verwendet, aber nirgends definiert. Sollten `zeile0` und `wert1`, und `zeile1` und `wert2` jeweils den selben Wert darstellen? Falls ja ist das entfernen des letzten Zeichens extrem umständlich geschrieben, denn ``s[0:len(s) - 1]`` ist das gleiche wie ``s[:-1]``. Falls damit ein eventuell vorhandenes Zeilenendezeichen entfernt werden soll, ist das nicht besonders robust, denn es könnten sowohl mehr als ein Zeichen das Ende der Zeile kennzeichnen, als auch gar kein Zeilenendezeichen vorhanden sein. Falls es okay ist generell „whitespace”-Zeichen am Ende zu entfernen, verwendet man besser die `rstrip()`-Methode.

Code: Alles auswählen

#!/usr/bin/env python
from itertools import islice


def main():
    with open('HIS_Data.txt', 'r') as lines:
        values = [line.rstrip() for line in islice(lines, 2)]
    print values


if __name__ == '__main__':
    main()
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Duesentrieb: Du hast offensichtlich eine Datei, in der pro Zeile eine Zahl steht, und diese möchtest Du gerne einlesen. Wenn das Format der Datei schon feststeht, hilft Dir JSON nicht viel, denn das ist bereits ein (anderes) Format zum Speichern von Grunddatentypen.
Dein gezeigter Code ist fehlerhaft. Er bricht spätestes in Zeile 10 mit einem NameError ab, da »wert1« nirgends definiert wird. Wie würde bei Deinem Vorgehen ein Programm aussehen das 100 Werte einliest? Dann brauchst Du offensichtlich eine Schleife.
Wenn das Öffnen der Datei fehlschlägt, wäre es ganz gut, auch den Grund zu kennen, den wirfst Du aber mit der nichtssagenden Meldung "nicht erfolgreich" einfach weg. Wenn Du nichts sinnvolles mit einer Exception anfangen kannst, laß sie sich einfach weiterreichen. »sys.exit« solltest Du übrigens gleich wieder vergessen. Innerhalb der »main«-Funktion kann das Programm mit einem einfachen »return« beendet werden, in jeder anderen Funktion darf das Programm gar nicht beendet werden.
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

Hallo BlackJack ,

danke für deine ausführliche Erklärung! :roll:
Ich bin absoluter Neuling und habe mir über die Namendefinition in diesem Fall in der Tat noch keine Gedanken gemacht.
Ich habe erst mal versucht etwas zum Laufen zu bekommen.

Offensichtlich war meine Eingangsfrage auch nicht verständlich.
Trotzdem danke ich dir dass du mir hier eins so ausführlich erklärung gegeben hast.

Ich werde mich jetzt mal an deinen Vorschlag machen und verstehen was da steht. :D

Hallo Sirius,
danke dir auch für deine Anmerkung.
Zu deiner Feststellung: Ich habe in einer Datei maximal 5 bis 8 Zeilen in denen die Listen im Formant [..., ..., ...] in unterschiedlichen Längen enthalten sind.
Ich möchte diese Listen einlesen und dann so verwenden, als wären sie fix im Programm enthalten. In meinem Fall sind das variable Zeitwerte die im Programm gelesen und geändert werden. Abgelegt werdne sollen sie extern in einer Datei.
Eine Fehlerbehandlung und auch das Schließen der Datei sind schon eingebaut, nur in meinem Beispiel nicht enthalten

Danke euch!
Daniel
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Duesentrieb: eine Beispieldatei sagt da manchmal mehr als tausend Worte ;-)

Code: Alles auswählen

import json
def read_lists():
    with open('HIS_Data.txt', 'r') as lines:
        return json.loads('[%s]' % ','.join(lines))
Dann stellt sich aber wirklich die Frage, warum dieses seltsame Datenformat und nicht gleich JSON.
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

Sirius3 hat geschrieben:@Duesentrieb: eine Beispieldatei sagt da manchmal mehr als tausend Worte ;-)

Code: Alles auswählen

import json
def read_lists():
    with open('HIS_Data.txt', 'r') as lines:
        return json.loads('[%s]' % ','.join(lines))
Dann stellt sich aber wirklich die Frage, warum dieses seltsame Datenformat und nicht gleich JSON.
Jetzt bin ich völlig verwirrt :roll:
Fangen wir noch mal von vorne an:

Ich wollte eigentlich ein Array in Python einprogrammieren, musste dann aber feststellen dass es so etwas nur als sogenannte "Liste" gibt, soweit o.k.
Ich habe also Listen in Form von

Code: Alles auswählen

 s1 = [23, 45, 66,...] 
reingenommen.
Auf diese Listen kann ich bequem z.B. in Schleifen zugreifen.

Um das ganze zu flexibilisieren wollte ich diese Listen in eine externe Datei schreiben. Deshalb steht in meinem Textfile zeileweise nun das was bisher in den Listen stand.
Ich bin dabei davon ausgegangen dass das importierte Format ebenfalls wie ursprünglich im Programm aussehen muss. Deshalb steh ich im moment an dieser Stelle... :shock:

Bin ich jetzt auf dem Holzweg?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Duesentrieb: Du hast also eine Liste aus Listen, was dem entspricht, was in anderen Programmiersprachen Array heißt. Es ist keine Matrix, da die Listen unterschiedliche Längen haben.
Also zum Beispiel sowas:

Code: Alles auswählen

arrays = [
    [1, 6, 45, 3],
    [9, 2, 33],
    [4, 32, 7],
]
Wenn Du diese Listen nun in eine Datei schreiben willst, kannst Du dafür Json benutzen:

Code: Alles auswählen

with open('datei.txt', 'wb') as output:
    json.dump(arrays, output)
Und diese genauso wieder einlesen:

Code: Alles auswählen

with open('datei.txt', 'rb') as input:
    arrays = json.load(input)
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

Jetzt bitte noch mal für mich ganz langsam. Ich steh jetzt voll auf dem Schlauch :?

Ich habe 2 Listen in einer Datei (hintereinander).

Die Textdatei (datei.txt) sieht so aus:
Adresse = [1, 2, 4, 8, 16, 32, 64, 128]
Zeita = [5, 10, 10, 10, 10, 10, 10, 10, 8]

Nun möchte ich diese baiden Listen in mein Programm holen um dann z.b. die erste mit
...
for n in Adresse:
Status = bus.read_byte_data(0x3a,n)
.....
zu verwenden
BlackJack

@Duesentrieb: So sollte die Datei nicht aussehen. Ändere das in JSON.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Duesentrieb: Du hast also Daten, die nichts miteinander zu tun haben, dann steck sie am besten zum Speichern in ein Dictionary:

Code: Alles auswählen

adressen = [1, 2, 4, 8, 16, 32, 64, 128]
zeiten = [5, 10, 10, 10, 10, 10, 10, 10, 8]

# Schreiben
with open('datei.txt', 'wb') as output:
    json.dump({'addressen': addressen, 'zeiten': zeiten}, output)

# Lesen
with open('datei.txt', 'rb') as input:
    data = json.load(input)
adressen = data['adressen']
zeiten = data['zeiten']
Variablennamen sollten immer den Inhalt beschreiben, und bei Listen bietet sich da der Plural an, weil ja nicht nur eine Adresse sondern viele Adressen in der Liste sind.
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

Hallo,
ich bin am verzeifeln.

Code: Alles auswählen

    
In der Textdatei - datei.txt:
adressen = [1, 2, 4, 8, 16, 32, 64, 128]
    zeiten = [5, 10, 10, 10, 10, 10, 10, 10, 8]
     

In Python:

import json

# Lesen
with open('datei.txt', 'rb') as input:
      data = json.load(input)
adressen = data['adressen']
zeiten = data['zeiten']
Und ich erhalte die Fehlermeldung

Bild

Was mache ich den nun falsch? Muss ich bei der Verwendung von json noch etwas beachten?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du hast keine gültige Json-Datei. Führe mal das Programm von Sirius aus und schau dir die Datei an.
Das Leben ist wie ein Tennisball.
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

Danke! :D
Jetzt hab ich es verstanden. Ich dachte ich momme mit meinem Format aus!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Kannst du auch, aber dein Format ist halt ziemlich unbrauchbar und man würde das besser mit JSON lösen können.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten