txt datei einlesen

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
genervternewbie
User
Beiträge: 25
Registriert: Samstag 17. November 2018, 18:42

ich möchte eine txt datei namens config.txt einlesen und die daten darin verwenden
ich habe schon einiges gefunden und getestet aber nichts was ich suche gefunden bzw umsetzen können
config.txt
1,2,321,355,313

Code: Alles auswählen

with open("file.txt", "r") as tf:
    lines = tf.read().split(',')
for line in lines:
    print(line)
Ausgabe

Code: Alles auswählen

1
2
321
355
313
Ok soweit verstehe ich alles und kann es auch nutzen
Ich bekam bei einem anderen anliegen folgende code

Code: Alles auswählen

DB_CONNECTIONS = [
    ("192.168.1.200", "pi", "raspberry", "rfid"),
    ("192.168.1.201", "pi", "raspberry", "rfid"),
    ("192.168.1.202", "pi", "raspberry", "rfid"),
   ... 
    ("192.168.1.254", "pi", "raspberry", "rfid")
    ]

for host, username, password, database in DB_CONNECTIONS:
    try:
         connection = mysql.connector.connect(
            host=host,
            user=username,
            password=password,
            database=database
          )
         break
    except <der-verbindungsfehler>:
        pass
Wenn ich den Code richtig verstehe, dann durchlaufe for solange bis eine Verbindung aufgebaut wurde oder das ende erreicht hat.
Wenn ich durchlauf nichts gefunden dann im except könnte ich dann ein satz nehmen
connection = mysql.connector.connect( host=localhost, user=pi, password=raspberry, database=rfid )
Ich dachte an
config.txt
Zeile 1
Hans,Klarin,Michael,Bully,Herbig,Dach,Haus,Wohnung...
ab Zeile 2
192.168.1.200,pi,raspberry,rfid,info200
192.168.1.201,pi,raspberry,rfid,info201
192.168.1.202,pi,raspberry,rfid,info202
....,
192.168.1.254,pi,raspberry,rfid,info254
Mit 2 Config-Datein würde ich es fast hinbekommen ( Ausnahme )
Die config.txt ist meine Config-Datei, so das ich am Script nicht ändern brauch ( Später vieleicht auch noch änderbar über webseite gemacht werden kann).
Wie in Zeile 1 möchte ich verschiedene Werte (Zahlen, Wörter oder Zahlen und Wörter) verwenden
ab Zeile 2 sollen dateien für mehrfach DB abfrage stehen mit einen Zusatz (Ausnahme) wo ich als Anzeige nutzen kann.
ich weiß da sich schleifen sogar ab einer bestimmten zeile ablaufen lassen kann allerdings bis zähler ende
da mein zählerende offen ist habe ich das zweite problem

Code: Alles auswählen

Input1 = line[2]   # pos 2 aus zeile 1      #z.B. Dach
Input2 = line[5]   # pos 5 aus zeile 1      #z.B. Michael

for oder while:
    try:
         connection = mysql.connector.connect(
            host=host,
            user=username,
            password=password,
            database=database
          )
         print("Zeige mir infoxxx ")
         break
    except:
         connection = mysql.connector.connect(
            host=host,
            user=username,
            password=password,
            database=database
          )
         print("Zeige mir infoxxx ")
    finally:
        print("Ok weiter")
Ist mein vorhaben überhaupt möglich wenn ja dann wie ?
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Ich würde das configparser Modul aus der Bibliothek nehmen.
imonbln
User
Beiträge: 191
Registriert: Freitag 3. Dezember 2021, 17:07

Ich kann dir nur abraten eine Konfiguration Datei zu schreiben, in welcher in magischen Zeilennummern irgendwas stehen muss. Grundsätzlich sind die meisten Konfigurationen Key/Value Paare oder sollten es sein. Die zu speichern, dafür gibt es schon erprobte Methoden. (INI, Toml, yaml, json, xml), um nur ein paar zu nennen.

Für JSON bringt Python das json Module mit, für INI den configparser, warum versucht du das Rad neu zu erfinden, statt dir eins der Formate zu nehmen und Fertige Module zu nehmen. Deine Konfiguration könnte als JSON vielleicht so aussehen. Das kannst du dann einfach mit json.load verarbeiten.

Code: Alles auswählen

{
    "array" : [1,2,321,355,313],
    "databases": [
        {
            "location": "192.168.1.200",
            "name": "pi",
            "user": "rfid"
        },
        {
            "location": "192.168.1.201",
            "name": "pi",
            "user": "rfid"
        },
        {
            "location": "192.168.1.202",
            "name": "pi",
            "user": "rfid"
        }
    ]
}

Code: Alles auswählen

import json

with open('config.json') as jin:
   configuration = json.load(jin)
for currentdb in configuration.get('databases', []):
     print(currentdb['location'], currentdb['user'])
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Öffnen sollte man das entweder als Binärdatei oder wenn Textdatei dann UTF-8 als Kodierung explizit angeben.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
genervternewbie
User
Beiträge: 25
Registriert: Samstag 17. November 2018, 18:42

Sorry zu viel input für mich
Mir sagen configparswer Modul, Bibliothek , json, ini, xml, usw kann ich nicht viel mit anfangen
ini sind für configurations datei aus Windows
xml hat was mit webseiten zu tun
bibliothek bei progamierung verstehe auch nicht viel ( denke ( import *.py ) sowas wäre gemeint)
aber habe mich mit diesen dingen nie beschäftigt

Code: Alles auswählen

    {
    "array" : [1,2,321,355,313],
    "databases": [
        {
            "location": "192.168.1.200",
            "name": "pi",
            "user": "rfid"
        },
        {
            "location": "192.168.1.201",
            "name": "pi",
            "user": "rfid"
        },
        {
            "location": "192.168.1.202",
            "name": "pi",
            "user": "rfid"
        }
sowas in der art habe ich schon
meine anzahl für location hier ist offen, es können 2 oder mehr werden
daher hier ein code wo ich weniger habe als wie hier gezeigt
Mein py programmm wollte ich flexibler machen, da ich mehrere Standort habe und aber den meisten Code von mir überall brauche
und nur 2,3 Punkte wo ich Text habe den ersetzen möchte und nicht für jedes Teil den ganzen Code durchsuchen will
da je nach standort auch andere IP adresse bzw DB anfallen wollte ich diese auch flexible halten
mein wissen ist was schleifen angeht beschränkt
ich weiß das ich eine bestimmte anzahl an durchläufe machen kann z.b.
i=1 x= 54
wiederhole solange i bis x erreicht ist
soweit habe ich schleifen als zähler verstanden
aber nicht wenn x = unbekannt ist
da dachte ich an
try:
wiederhole solange bis ende
except:
falls nicht dann das hier
finally:
ok hier geht es weiter
ich brauche also ein schleife innerhalb vom try
meine texte wo ich ändern will dachte ich an Variablen ( Globale Variablen )
Ich wollte alles in eine Datei packen und auslesen für jeden bedarf
aber es soll per website mit php eine schnelle lösung zur änderung meiner configdatei möglich sein
mein code basiert nur auf dem was ich verstehe so sachen wo json und co denke ich das ich zu wenig wissen noch über python habe
und erst später mehr dazu lernen kann wen ich mehr verstehe
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Den Code, der etwas solange tut, bis es klappt, den habe ich dir doch schon gezeigt. Wieso brauchst du also ploetzlich wieder "ein schleife innerhalb vom try"?

Und wenn dir etwas nichts sagt, dann kann man das ja aendern. Indem man das mal nachliest.
genervternewbie
User
Beiträge: 25
Registriert: Samstag 17. November 2018, 18:42

meiner versuche ergaben
das ich nur 1 abfrage bei try machen kann
try:
mydb = mysql.connector.connect(
host="192.168.1.200",
user="pis",
password="raspberry",
database="rfid"
)
print("nein")
except:
mydb = mysql.connector.connect(
host="localhost",
user="pi",
password="raspberry",
database="rfid"
)
print("ja")
finally:
time.sleep(0.2)
ich verstehe hier wenn zwischen try und except ein ok wäre dann weiter mit finally
sonst nim except und dann finally
aber ich will eine unbekannte anzahl testen erst bevor ich zu except komme

Nachlesen ist leichter gesagt ich fand nur
x = 0
while x < 5:
print( x )
oder
orte = ["Berlin", "Stuttgart", "Frankfurt", "Hamburg"]
for x in orte:
print( x )
wenn ich mehr als 1 mal orte habe
im grunde sowas
orte = ["Berlin1", "Stuttgart1", "Frankfurt1", "Hamburg1"]
orte = ["Berlin2", "Stuttgart2", "Frankfurt2", "Hamburg2"]
orte = ["Berlin3", "Stuttgart3", "Frankfurt3", "Hamburg3"]
das wo ich X habe eine schleife laufen habe
try:
mydb = mysql.connector.connect(
host="BerlinX",
user="StuttgartX",
password="FrankfurtX",
database="HamburgX"
)
print("nein")
except:
mydb = mysql.connector.connect(
host="Mainz",
user="Koeln",
password="Reute",
database="Gedern"
)
print("ja")
finally:
time.sleep(0.2)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe dir konkreten Code gezeigt. Was an dem kapierst du nicht?
Antworten