2016-08-01 20 views
0

Mit Python 2.7 möchte ich eine Datei als Eingabe nehmen, einige Zeichen daraus entfernen und diese in eine andere Datei schreiben. Ich bin nicht ganz mit dem Code unten folgenden:Schwierigkeit beim Parsen von Textdatei Python 2.7

print 'processing .ujc file for transmit' 
infile, outfile = open('app_code.ujc','r'), open('app_code_transmit.ujc','w') 
data = infile.read() 
data = data.replace("#include <avr/pgmspace.h> const unsigned char uj_code[] PROGMEM = {", "") 
data = data.replace("0x", "") 
data = data.replace(", ", "") 
data = data.replace("};", "") 
outfile.write(data) 

Die Eingabedatei (Beispiel):

#include <avr/pgmspace.h> 

const unsigned char uj_code[] PROGMEM = { 

    0x00, 0x03, 0xB1, 0x4B, 0xEC, 0x00, 0x1D, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x02, 0x6A, 0x00, 0x02, 
    0x6A, 0x00, 0x02, 0xE3, 0x3F, 0x00, 0x1F, 0x00, 0x02, 0x2C, 0x00, 0x01, 0x3B, 0x00, 0x02, 0x36, 0x00, 0x00 
}; 

Und das sollte sich (das etc ist eine Fortsetzung der oben genannten und nicht wirklich vorhanden):

0003B14BEC001D001E002100026A00(...etc...)02360000 

Was ich mit dem obigen Code zu bekommen ist:

#include <avr/pgmspace.h> 

const unsigned char uj_code[] PROGMEM = { 

    0003B14BEC001D001E002100026A00(...etc...) 
    02360000 

Mit anderen Worten, ich möchte alle Zeichen, leere Zeilen und 0x und Zeug mit Ausnahme der tatsächlichen Bytes in einer einzigen kontinuierlichen Linie entfernen, aber ich stolpere ein wenig über die Nuancen, die ich erwarte. Irgendeine Hilfe?

+1

Sie versuchen, mit einer Aussage zwei verschiedene Linien zu ersetzen. Dazwischen gibt es '\ n' (oder '\ r \ n'). – MKesper

Antwort

0

@MKesper hat Recht. Wenn Sie die Datei lesen, gibt es abhängig von Ihrem Betriebssystem \ n oder \ r \ n (Zeilentrennzeichen). Wenn ich mir die erwartete Ausgabe anschaue, wäre es meiner Meinung nach der bessere Weg, die benötigten Daten zu extrahieren, anstatt die unerwünschten Daten zu löschen. Ich würde etwas Hilfe von regulären Ausdrücken nehmen und hier ist mein Versuch:

import re 
print 'processing .ujc file for transmit' 
infile, outfile = open('app_code.ujc','r'), open('app_code_transmit.ujc','w') 
data = infile.read() 
# Expect 0003B14BEC001D001E002100026A00026A0002E33F001F00022C00013B0002360000 to be the output 
outfile.write(''.join(re.findall('0x([0-9a-fA-F][0-9a-fA-F])', data))) 

Update 1: Dies basiert auf der Annahme, dass Sie keine andere 0x haben. Andernfalls müssen wir unseren regulären Ausdruck aktualisieren

+0

Dies ist ein besserer Ansatz als meiner, danke. Eine kleine Einschränkung: In der sechsten Zeile ist es nicht "str", sondern "Daten". Alternativ können Sie "Daten" in "str" ​​umbenennen. –

0

Ihre Eingabedatei ist in mehrere Zeilen aufgeteilt und Sie sind nach einer einzigen Zeile ausgegeben.

Sie müssen lediglich vor dem Schreiben keine Zeilenumbrüche abzustreifen:

data.strip("\n") 
+0

Sie haben Recht, vergessen die unsichtbaren Zeichen. Vielen Dank. –