String Manipulation + Konkatenation

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
chronical_chaos
User
Beiträge: 13
Registriert: Montag 21. März 2005, 15:50

Hallo NG,

Ich übertrage von einem Microcontroller via RS-232 Daten an einen PC.
Die übertragenen Daten werden von einem Python Progrämmsche eingelesen und abgespeichert.
Vor dem abspeichern möchte ich den String in dem die Daten eingelesen wurden noch etwas "bearbeiten".

Die Daten im String sehen im Prinzip immer folgendermaßen aus:

string= [1_ID;2_loByte(3-0);3_hiByte(7-4); Datensatz\CR\CR\NL
0000012C;7F880800;00178803;DSa\CR\CR\NL
0000012C;7F880800;00178803;DSa\CR\CR\NL
.
.
.
0000012C;7F880800;00178803;DSa\CR\CR\NL
\NUL\ESC\EOF]

Ich möchte nun den String folgendermaßen manipulieren:
1. In jeder Zeile soll ein Carriege Return gelöscht werden
2. Das NUL und ESC am Ende des Strings soll gelöscht werden
3. ab der zweiten Zeile möchte ich jedem Wert ein "0x" voranstellen.

Der String soll am Ende folgendes Aussehen haben:

string[]= [1_ID;2_loByte(3-0);3_hiByte(7-4); Datensatz\CR\NL
0x0000012C;0x7F880800;0x00178803;DSa\CR\NL
0x0000012C;0x7F880800;0x00178803;DSa\CR\NL
.
.
.
0x0000012C;0x7F880800;0x00178803;DSa\CR\NL
\EOF]

Wäre prima wenn mir diesbezüglich jemand weiterhelfen könnte.
Vielen Dank im voraus.

chronical_chaos
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Warum nicht einfach mit replace() arbeiten?

Für solche Fälle ist folgendes Hilfreich:

Code: Alles auswählen

for i in xrange(255):  print i,"-",chr(i),chr(i).encode("String_Escape")

Code: Alles auswählen

meinString = meinString.replace("\r\r","\r") # Einfacher \CR
meinString = meinString.replace("\x00\x1b","") # Null + ESC löschen
chronical_chaos hat geschrieben:3. ab der zweiten Zeile möchte ich jedem Wert ein "0x" voranstellen.
Dann alles in einer Schreife packen...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
chronical_chaos
User
Beiträge: 13
Registriert: Montag 21. März 2005, 15:50

Danke für die schnelle Antwort.

Kannst Du mir erklären was Du da machst?
for i in xrange(255): print i,"-",chr(i),chr(i).encode("String_Escape")
Das mit replace ist ne gute Idee.

Wie würdest Du die Schleife machen?

MfG

chronical_chaos
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

chronical_chaos hat geschrieben:Kannst Du mir erklären was Du da machst?
Meine Schleife produziert einfach nur eine ASCII Tabelle. Zusätzlich erfährt man so, wie ein Zeichen in Python's String Escape aussieht. z.B. NULL ist \x00 ;) Ich einfach nur hilfreich...

In deinem Falle würde ich deinen String mit .split() aufteilen und dann in einer for-Schleife packen...
Also ungefähr so:

Code: Alles auswählen

for line in MeinString.split("\x1b\x1b\x00"):
    print line

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Das "\EOF" am Ende habe ich einfach mal komplett weggelassen, weil das kein ASCII Zeichen ist:

Code: Alles auswählen

test_string = """1_ID;2_loByte(3-0);3_hiByte(7-4); Datensatz\r\r
0000012C;7F880800;00178803;DSa\r\r
0000012C;7F880800;00178803;DSa\r\r
0000012C;7F880800;00178803;DSa\r\r
\0\x1b"""

def transform(string):
    # 
    # Split into lines and replace two carriage returns by one.
    # 
    lines = map(lambda x: x.replace('\r\r', '\r'), string.split('\n'))
    # 
    # First line will not be changed further.
    # 
    result = [lines[0]]
    # 
    # Second to next to last line are processed.  Last line is discarded as it
    # contains no data anymore.
    # 
    for line in lines[1:-1]:
        # 
        # Split every line at ';', prepend '0x' to the first three fields and
        # join all fields again.
        # 
        fields = line.split(';')
        result_line = map(lambda x: '0x' + x, fields[:3]) + fields[3:]
        result.append(';'.join(result_line))
    
    return '\n'.join(result)

print transform(test_string)
chronical_chaos
User
Beiträge: 13
Registriert: Montag 21. März 2005, 15:50

Super! ! ! Ist genau das was ich wollte. Habs heute in mein Programm eingebaut, und funzt 1a.

Vielen Dank.

chronical_chaos
Antworten