2016-05-03 20 views
1

Ich habe eine Binärdatei, von der ich versuche, Strings zu extrahieren, und ich habe ziemlich viel Zeit damit. :(Python - Hilfe mit Parsing-Datei benötigt. Gibt es eine Möglichkeit, EOF-Zeichen zu ignorieren?

Meine aktuelle Strategie ist das Einlesen der Datei mit Python (mit einer der folgenden Funktionen: read(), readline() oder readlines()). Als nächstes analysiere ich die Zeile (char by char) und suchen Sie nach dem Sonderzeichen ‚o‘, die in den meisten Fällen die Saiten direkt folgt ich will! Abschließend möchte ich rückwärts aus dem Sonder char analysieren alle Zeichen der Aufnahme, die ich als identifiziert „gültig“.

Am Ende des Tages möchte ich den vorderen Zeitstempel und die nächsten 3 Strings innerhalb der Linie.

Ergebnisse:

In der Eingabebeispielzeile # 1 lesen die "read" -Funktionen nicht die gesamte Zeile (im Ausgabebild dargestellt). Ich glaube, das liegt daran, dass die Funktion das Binärwort als EOF-Zeichen interpretiert und dann aufhört zu lesen.

In Zeile # 2 des Beispiels gibt es Zeiten, in denen das "spezielle Zeichen" angezeigt wird, jedoch nicht nach einer Zeichenfolge, die ich extrahieren möchte. :(

Gibt es einen besseren Weg, um diese Daten zu analysieren? Wenn nicht, ist es Art und Weise Problem in Beispiel Zeilen # 1?

Beispiele für Eingangsdaten und die resultierenden Ausgangsdatum gesehen zu lösen, wenn ich drucke nur die Linien als gelesen. wie Sie sehen können, ist es durch die gesamte Zeile nicht zu lesen, wenn readlines() Examples of input data and the resulting output data when I just print the lines as read. As you can see, it does not read through the entire line when using readlines()

Mein String Extraktion Algorithmus, der nicht sehr robust ist. My string extraction algorithm, which is not very robust.

FYI, Effizienz nicht unbedingt Bedeu ist t.

+1

von Code als Screenshot Bild veröffentlichen, Sie machen es uns viel schwerer, Ihnen zu helfen. –

+1

Es gibt kein EOF-Zeichen, EOF ist nur die Bedingung, um das Ende der Datei zu erreichen. – Barmar

Antwort

0

Warum Python verwenden. Verwenden Sie Zeichenketten und Rohr es durch den Kopf, zB

strings /bin/ls | head -3 

und sehen, was Sie erhalten. Sie können auch für Windows eine Zeichenfolge erhalten.

+0

Dies scheint zu sein, was ich suche. Ich lade strings2 für Windows herunter und gebe ihm eine Chance und es scheint gut zu funktionieren! Hier ist der Ausgang:
'41080, 1-Hallo Firma Hier ?= \t Carpenter 202-Carpenter Haus Personxyz
401058, Eigentümer der Fläche LLC Firmennamen 213-Ingledue East names'

Wie Sie es vermasselt nur 1 Mal. Dieses Etwas, das ich denke, kann ich in Python aufräumen, indem ich einige Zeichen ausfiltern, von denen ich weiß, dass sie nicht verwendet werden.
Vielen Dank für den Vorschlag @Jorgen. – jindurhur

+0

Entschuldigung, ich bin neu dazu:/ Dies scheint zu sein, was ich suche. Ich lade strings2 für Windows herunter und gebe ihm eine Chance und es scheint gut zu funktionieren! Hier ist die Ausgabe: '41080, 1-Hallo Comapany hier = \t Carpenter 202-Carpenter Haus Personxyz 401058, Eigentümer der Fläche LLC Firmennamen 213-Ingledue East names' Wie Sie? kann es nur einmal vermasseln. Dieses Etwas, das ich denke, kann ich in Python aufräumen, indem ich einige Zeichen ausfiltern, von denen ich weiß, dass sie nicht verwendet werden. Vielen Dank für den Vorschlag @Jorgen. – jindurhur

0

Wenn die Daten binär sind, lesen Sie sie nicht als Text. Lies es als binäre Daten und versuche dann, Strings zu finden, die in den binären Daten eingebettet sind.

with open("example.tp", "b") as f: 
    data = f.read() # produces a bytes object in python 3 

aufgeteilt nun Ihre Daten basierend auf dem Terminal-Zeichen

parts = data.split(b'\xf4') # f4 is hex code for your o character in latin-1 

nun von jedem Teil, wie am besten die Zeichenfolge extrahieren können Sie:

from string import ascii_letters, digits 

special_chars = '-()&, ' 
desired_chars = bytes(ascii_letters + digits + special_chars, encoding="ascii") 

data = b'0,123\xf4NOPE#Hello world\xf4ignored' # sample data 

parts = data.split(b'\xf4') 

strings = [] 
for p in parts[:-1]: # ignore last part as it is never followed by the split char 
    reversed_bytes = p[::-1] 
    # extract the string 
    for i, byte in enumerate(reversed_bytes): 
     if byte not in desired_chars: 
      chunk = reversed_bytes[:i] 
      break 
    else: 
     chunk = reversed_bytes # all chars were valid 
    bytes_ = chunk[::-1] 
    bytes_ = bytes_.replace(b',', b'') 
    strings.append(bytes_.decode("ascii")) # turn into a str 
    # use ascii codec as there should be no non-ascii bytes in your string 

print(strings) # prints ['0123', 'Hello world']