.txt formatieren

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
AnDre86
User
Beiträge: 31
Registriert: Dienstag 2. Januar 2018, 14:35

Hallo zusammen,

arbeite mich langsam voran in Python 3 stoße aber leider immer wieder auf kleine Probleme.

Hab jetzt wieder mal das Script am wickel was wunderbar seine arbeit leistet, welches ich mit eurer Hilfe vorige woche erstellt habe.
Nebenbei Lektüre gelesen Tutorials angeschaut etc. .

Aber eins erschlißet sich mir nicht leider, formatierung einer .Txt Datei :)

Momentan schaut es so aus das ich meine Daten wie folgt angezeigt bekomme:

COM1
Daten gespeichert
#KN1 29.12.17 08:10:04 CO 0.0000 0.0265
#KN1 29.12.17 08:10:04 CO2 0.0000 -0.0034
#KN1 29.12.17 08:10:04 H2 0.0000 0.0319
#NE 29.12.17 08:10:09 CO 0.54% -0.66%
#NE 29.12.17 08:10:09 CO2 0.25% -4.76%
#NE 29.12.17 08:10:09 H2 0.92% -11.24%
#KK 29.12.17 08:17:09 CO 23.870 23.858
#KK 29.12.17 08:17:09 CO2 23.430 23.606
#KK 29.12.17 08:17:09 H2 3.7400 3.7832
#NE 29.12.17 08:17:13 CO 0.54% -0.71%
#NE 29.12.17 08:17:13 CO2 0.25% -4.01%
#NE 29.12.17 08:17:13 H2 0.92% -10.08%

aber in der .Txt werden sie wie folgt gespeichert:
#KN1 29.12.17 08:10:04 CO 0.0000 0.0265 #KN1 29.12.17 08:10:04 CO2 0.0000 -0.0034 #KN1 29.12.17 08:10:04 H2 0.0000 0.0319 #NE 29.12.17 08:10:09 CO 0.54% -0.66% #NE 29.12.17 08:10:09 CO2 0.25% -4.76% #NE 29.12.17 08:10:09 H2 0.92% -11.24% #KK 29.12.17 08:17:09 CO 23.870 23.858 #KK 29.12.17 08:17:09 CO2 23.430 23.606 #KK 29.12.17 08:17:09 H2 3.7400 3.7832#NE 29.12.17 08:17:13 CO 0.54% -0.71% #NE 29.12.17 08:17:13 CO2 0.25% -4.01% #NE 29.12.17 08:17:13 H2 0.92% -10.08%


halt hinter einander weg, in meinem Editor sieht das noch schlimmer aus.

habe es Probiert mit:

Code: Alles auswählen

import serial, time

with serial.Serial('COM1', 9600, timeout=1) as ser:
    if ser.isOpen():
        print('COM1')
           
    while True:
        serial_line = ser.readline()
        if serial_line:
            log = serial_line.decode('utf-8')
            print("Daten gespeichert")
            date = time.strftime("%d.%m.%Y")
            #with open(r"C:\Users\xx\Desktop\Test\{date} test.txt".format(date=date), "a") as f:
            with open(r"C:\Users\xx\Desktop\Test\temp.txt", "w") as f:
                f.write(log)
                
            text = open(r"C:\Users\xx\Desktop\Test\temp.txt")
            for line in text:
                print(line.rstrip())

                #text = print(line.rstrip())
                #with open(r"C:\Users\xx\Desktop\Test\{date} test.txt".format(date=date), "a") as f:
                    #f.write(text)
das was in # steht funktioniert leider nicht da print(*) "none" ausgibt. Das war halt meine Idee. Ich hatte auch die Idee das ganze über eine temp.txt laufen zu lassen um es vor jedem einlesen zu bearbeiten und dann im nächsten Schritt an das "Log" anzufügen Zeile für Zeile halt.

Gibt es denn einen Befehl wie:

Code: Alles auswählen

text = open(r"C:\Users\xx\Desktop\Test\temp.txt")
            for line in text:
                print(line.rstrip())
nur zum schreiben?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also für mich sieht das so aus als ob du dir da jedes Mal die bestehenden Zeilen schon wieder über schreibst. Da brauchst du doch den Modus ‚a‘ für Open....

Wie dem auch sei: dein Problem löst sich ganz einfach. write speichert nur die Daten die übergeben bekommen. print hingegen fügt automatisch eine neue zeile ein. Das musst du einfach auch nur machen. Denn das Zeilenende Zeichen hast du vorher mittels rstrip() ja extra entfernt.
AnDre86
User
Beiträge: 31
Registriert: Dienstag 2. Januar 2018, 14:35

Ja die temp wird immer wieder neu geschrieben soll ja nur als zwischen speicher dienen, quasi sie wird geschrieben daraus lese ich dann die einzelnen zeilen aus lasse sie mir anzeigen und danach wollte ich die eigentlich mit den letzten Zeilen in # in die eigentliche Datei schreiben mit 'a' die dann hallt immer erweiter wird mit formatierten .txt wo jede Zeile auch nur in einer Zeile steht. Werde morgen nochmal runde grübeln mit deinem Tip.

Danke. :)
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Aber wozu? Die,Daten dieser schreibst und dann einliest kannst du doch gleich ausgeben?!?
AnDre86
User
Beiträge: 31
Registriert: Dienstag 2. Januar 2018, 14:35

das Stimmt aber wenn ich später die .Txt über den Editor öffne möchte ich gern eine Strukturierte Textdatei haben so wie es schon ganz gut mit Print über das Script klappt.
So soll es dann halt auch in der Textdatei stehen anstatt alles hintereinander weg.

LG
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@AnDre86: wie __deets__ schon geschrieben hat, braucht jede Zeile ihr Zeile-Ende-Zeichen. Aus Deinem Code werde ich aber nicht schlau, was wo geschrieben werden soll, denn beim `write` in Zeile 15 hat `log` ein Zeile-Ende-Zeichen und das Lesen und wieder Schreiben mach dann keinen Sinn, weil Du ja auch direkt schreiben könntest.

Dein Code aufgeräumt würde so aussehen

Code: Alles auswählen

import serial
 
with serial.Serial('COM1', 9600) as ser:
    for serial_line in ser:
        log = serial_line.decode('utf-8')
        print("Daten gespeichert")
        date = time.strftime("%Y-%m-%d")
        with open(r"C:\Users\xx\Desktop\Test\{date} test.txt".format(date=date), "a") as f:
            f.write(log)
und da dürfte es keine Probleme geben.
AnDre86
User
Beiträge: 31
Registriert: Dienstag 2. Januar 2018, 14:35

Es Funktioniert ja auch alles

Nur:

https://picload.org/view/ddlrgloi/unbenannt.jpg.html

so sieht das im Editor aus. Würde aber gerne das jede neue Zeile die mit # beginnt in einer neuen Zeile steht. :)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@AnDre86: Du benutzt ja auch keinen Editor. Das, was Du da benutzt, erwartet die unter Windows üblichen zwei Zeichen, Wagenrücklauf und Nächste-Zeile ("\r\n"), was eigentlich automatisch beim Schreiben von Text-Dateien unter Windows geschrieben werden sollte. Nimm irgendeinen ordentlichen Editor (z.B. Notepad++) und schau Dir dort die Datei an.
AnDre86
User
Beiträge: 31
Registriert: Dienstag 2. Januar 2018, 14:35

Ja da passt es da hab ich das schon mit bekommen. Dachte halt das die Möglichkeit mit einer .txt auch besteht so hinzu bekommen.

LG
AnDre86
User
Beiträge: 31
Registriert: Dienstag 2. Januar 2018, 14:35

Ok hab jetzt alle Probleme beseitigt und es arbeitet wie es soll. Hatte noch Schwirigkeiten das bei jedem neuen Einlesen von Daten keine neue Zeile genommen wurde.

Mit:

Code: Alles auswählen

with open(r"C:\Users\x\Documents\x\Messpunkt Süd\x\{date}  x.txt".format(date=date), "a") as f:
                f.write(log, '\n')
kam immer Fehler: write() takes exactly one argument (2 given)

mit

Code: Alles auswählen

text.write(log.format('\n'))
hab ich dann das Problem behoben.

Vielen Dank für eure Anregungen und Antworten und eurer Zeit.

LG
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@AnDre86: ganz sicher nicht. Programmieren ist nicht so lange raten bis etwas rauskommt, was so aussieht, als ob es funktioniert, sondern wissen was man tut.

1. `log` enthält schon das Zeile-Ende-Zeichen, da nochmal ein anzufügen macht dir nur Leerzeilen.
2. was `write` an Parametern erwartet, steht in der Dokumentation
3. `text` wäre dann bei Dir `f`.
4. `log.format` tut im Normalfall exakt nichts, weil in den Log-Zeilen keine Formatangeben enthalten sind. Sollten zufällig doch einmal Sonderzeichen drin sein, fliegt Dir diese Zeile dann um die Ohren.
AnDre86
User
Beiträge: 31
Registriert: Dienstag 2. Januar 2018, 14:35

ok, danke für die Hinweise dann schaue ich mir das nochmal an.

LG
AnDre86
User
Beiträge: 31
Registriert: Dienstag 2. Januar 2018, 14:35

Hallo,

hab mich mal wieder dran gesetzt und habe jetzt folgenes zusammen geschrieben.

Code: Alles auswählen

import serial, time

with serial.Serial('COM1', 9600, timeout=1) as ser:
    if ser.isOpen():
        print('COM1', '\n')
    try:      
        auswahl = int(input("Messpunkt 1 Nord:      Eingabe 1\nMesspunkt 1 Nord 2:  Eingabe 2\nMesspunkt 2 Süd:       Eingabe 3\nEingabe mit Enter bestätigen.\nEingabe: "))
        print("\nEmpfange Daten...")
    except ValueError:
        print("\nFalsche Eingabe, bitte erneut starten.\n")
        input("Mit Enter beenden.")
    else:
        if auswahl == 1:
            while True:
                serial_line = ser.readline()
                if serial_line:
                    log = serial_line.decode('utf-8')
                    date = time.strftime("%d.%m.%Y")

                    with open(r"C:\Users\x\Documents\analysen\Messpunkt Nord\Nord\{date} Kali Nord.txt".format(date=date), "a") as f:
                        f.write(log)
                        print('\n', "Daten gespeichert", '\n')  
                    
                    with open(r"C:\Users\x\Documents\analysen\script\Analysemessung\temp\temp.txt", "w") as f:
                        f.write(log)
                        
                    new_text = open(r"C:\Users\x\Documents\analysen\script\Analysemessung\temp\temp.txt")
                    for line in new_text:
                        print(line.rstrip())

        elif auswahl == 2:
            while True:
                serial_line = ser.readline()
                if serial_line:
                    log = serial_line.decode('utf-8')
                    date = time.strftime("%d.%m.%Y")

                    with open(r"C:\Users\x\Documents\analysen\Messpunkt Nord\Nord 2\{date} Kali Nord 2.txt".format(date=date), "a") as f:
                        f.write(log)
                        print('\n', "Daten gespeichert", '\n')  
                    
                    with open(r"C:\Users\x\Documents\analysen\script\Analysemessung\temp\temp.txt", "w") as f:
                        f.write(log)
                        
                    new_text = open(r"C:\Users\x\Documents\analysen\script\Analysemessung\temp\temp.txt")
                    for line in new_text:
                        print(line.rstrip())

        elif auswahl == 3:
            while True:
                serial_line = ser.readline()
                if serial_line:
                    log = serial_line.decode('utf-8')
                    date = time.strftime("%d.%m.%Y")

                    with open(r"C:\Users\x\Documents\analysen\Messpunkt Süd\Süd\{date} Kali Süd.txt".format(date=date), "a") as f:
                        f.write(log)
                        print('\n', "Daten gespeichert", '\n')  
                    
                    with open(r"C:\Users\x\Documents\analysen\script\Analysemessung\temp\temp.txt", "w") as f:
                        f.write(log)
                        
                    new_text = open(r"C:\Users\x\Documents\analysen\script\Analysemessung\temp\temp.txt")
                    for line in new_text:
                        print(line.rstrip())

kann man das ganze verkürzen und wie könnte es mir gelingen das wenn eine falsche Eingabe geschieht er wieder den

Code: Alles auswählen

auswahl = int(input("Messpunkt 1 Nord:      Eingabe 1\nMesspunkt 1 Nord 2:  Eingabe 2\nMesspunkt 2 Süd:       Eingabe 3\nEingabe mit Enter bestätigen.\nEingabe: "))
abfragt?

Danke schonmal für eure Anregungen :)

LG
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@AnDre86: Du hast drei mal fast das Selbe. Das lagert man in eine Funktion aus, überführt die Abweichungen in Parameter und ruft die Funktion an den entsprechenden Stellen auf.

Zum Code:
Zeile 4/5: isOpen liefert immer True, die zwei Zeilen können ersatzlos gelöscht werden.
Zeile 11: die Angabe ist falsch. Wenn Du bei Falscheingaben wiederholen willst, brauchst Du eine Schleife.
Zeile 14/15: wie schon öfter geschrieben, lösch das Timeout weg, das brauchst Du sowieso nicht und mach aus der while-Schleife eine for-Schleife.
Zeile 18: wie schon öfter geschrieben, Datumsangaben in Dateinamen sind immer Jahr-Monat-Tag, damit man die Dateien einfach alphabetisch sortieren kann.
Zeile 24-29: wie schon öfter geschrieben macht das Schreiben in eine Datei um sie gleich danach wieder zu lesen keinen Sinn. `print(log.strip())` tut das selbe.
AnDre86
User
Beiträge: 31
Registriert: Dienstag 2. Januar 2018, 14:35

hallo, Danke für deine anmerkung.

das mit print(log.strip()) erziehlt kein gewünschtes Ergebnis hatte das ja anfangs auch so. aber die Ausgabe im cmd ist dann einfach hinter einander weg. Deswegen hatte ich den Umweg über die extra Datei gewählt die ich erst schreibe und dann auslese. finde die Lösung auch nicht schön würde mir das ja auch gerne ersparen aber wie gesagt habe es gerade ebend nochmals getestet das klappt nicht mit dem Befehl.

LG
AnDre86
User
Beiträge: 31
Registriert: Dienstag 2. Januar 2018, 14:35

Ach und wegen Datum das hatte ich ganz übersehen :roll: und wenn ich das Timeout entferne liest er keine Daten ein.

Das andere werd ich mir mal erarbeiten.

LG
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@AnDre86: Du willst also behaupten, ein

Code: Alles auswählen

print("Hallo")
print("Hallo")
schreibt bei Dir "HalloHallo" auf den Bildschirm?

Wenn dem wirklich so wäre, dann ist bei Deinem System etwas kaputt. Welche seltsamen Einstellungen hast Du bei Deiner Python-Installation oder Deinen Windowseinstellungen gemacht?
AnDre86
User
Beiträge: 31
Registriert: Dienstag 2. Januar 2018, 14:35

Nein da passiert schon das richtige :)

Frag mich nicht habe keine Einstellungen verändert.

hier mal so wie es jetzt geht und so wie du vorschlägst und ich es auch schon als erstes hatte.

Code: Alles auswählen

with open(r"C:\Users\xl\Desktop\Test\temp.txt", "w") as f:
                        f.write(log)
                        
                    new_text = open(r"C:\Users\x\Desktop\Test\temp.txt")
                    for line in new_text:
                        print(line.rstrip())
Ausgabe: in CMD
#KN1 29.12.17 08:10:04 CO 0.0000 0.0265
#KN1 29.12.17 08:10:04 CO2 0.0000 -0.0034
#KN1 29.12.17 08:10:04 H2 0.0000 0.0319
#NE 29.12.17 08:10:09 CO 0.54% -0.66%
#NE 29.12.17 08:10:09 CO2 0.25% -4.76%
#NE 29.12.17 08:10:09 H2 0.92% -11.24%
#KK 29.12.17 08:17:09 CO 23.870 23.858
#KK 29.12.17 08:17:09 CO2 23.430 23.606
#KK 29.12.17 08:17:09 H2 3.7400 3.7832
#NE 29.12.17 08:17:13 CO 0.54% -0.71%
#NE 29.12.17 08:17:13 CO2 0.25% -4.01%
#NE 29.12.17 08:17:13 H2 0.92% -10.08%

mit

Code: Alles auswählen

print(log.strip())
Ausgabe in CMD:
#KN1 29.12.17 08:10:04 CO 0.0000 0.0265#KN1 29.12.17 08:10:04 CO2 0.0000 -0.0034#KN1 29.12.17 08:10:04 H2 0.0000 0.0319
#NE 29.12.17 08:10:09 CO 0.54% -0.66%#NE 29.12.17 08:10:09 CO2 0.25% -4.76%#NE 29.12.17 08:10:09 H2 0.92% -11.24%
#KK 29.12.17 08:17:09 CO 23.870 23.858#KK 29.12.17 08:17:09 CO2 23.430 23.606#KK 29.12.17 08:17:09 H2 3.7400 3.7832
#NE 29.12.17 08:17:13 CO 0.54% -0.71%#NE 29.12.17 08:17:13 CO2 0.25% -4.01%#NE 29.12.17 08:17:13 H2 0.92% -10.08%

ich weis hab schon edliche Texte dazu durchforstes und sollte ja auch so gehen und jemand der das schon länger macht dem Vertraue ich da auch aber ich hab sonst keinen Rat woran es liegen könnte. :/

Achso als Anmerkung vielleicht, es wird eine Datei gesendet die ich empfange, Kein Zeile für Zeile Text
AnDre86
User
Beiträge: 31
Registriert: Dienstag 2. Januar 2018, 14:35

Update: es Funktioniert. Danke an

@__deets__
@Sirius3

Das Problem war ganz einfach da ich es leider nicht wusste. Am Test Rechner habe ich immer ganze Textdateien mit einigen Zeilen Inhalt gesendet.
Heute im Feldtest ist mir aufgefallen das, dass sende Gerät den Text Zeilenweise sendet so mit Funktioniert:

Code: Alles auswählen

print(log.strip())
tadellos.

Nun werde ich mich an die anderen Hinweise bzw Verbesserungen machen.

Ich danke euch viel mals.

mit verlaub werde ich mal das was ich dann soweit fertig habe nochmals posten um Kritik zu ernten.

LG
Antworten