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
String Manipulation + Konkatenation
- 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:
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
Dann alles in einer Schreife packen...chronical_chaos hat geschrieben:3. ab der zweiten Zeile möchte ich jedem Wert ein "0x" voranstellen.
-
- 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?
Wie würdest Du die Schleife machen?
MfG
chronical_chaos
Kannst Du mir erklären was Du da machst?
Das mit replace ist ne gute Idee.for i in xrange(255): print i,"-",chr(i),chr(i).encode("String_Escape")
Wie würdest Du die Schleife machen?
MfG
chronical_chaos
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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...chronical_chaos hat geschrieben:Kannst Du mir erklären was Du da machst?
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
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)
-
- 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
Vielen Dank.
chronical_chaos