0

文字列を抽出しようとしているバイナリ ファイルがあり、それを行うのにかなりの時間を費やしています。:(

私の現在の戦略は、Python を使用してファイルを読み込むことです (次の関数のいずれかを使用します: read()、readline()、または readlines())。次に、行を (1 文字ずつ) 解析し、特殊文字 'ô' を探します。ほとんどの場合、これは目的の文字列の直後に続きます! 最後に、「有効」であると識別したすべての文字を記録する特別な文字から逆方向に解析します。

結局のところ、先頭のタイム スタンプと、行内の次の 3 つの文字列が必要です。

結果:

入力例の行 #1 では、「読み取り」関数は行全体を読み取りません (出力イメージに示されています)。これは、関数がバイナリを EOF char として解釈し、読み取りを停止したためだと思います。

例の 2 行目で、「特殊文字」が表示される場合がありますが、抽出したい文字列の後ではありません。:(

このデータを解析するより良い方法はありますか? そうでない場合、#1 の例に見られる問題を解決する方法はありますか?

行を読み取ったまま印刷した場合の入力データと結果の出力データの例。ご覧のとおり、使用時に行全体を読み取るわけではありませんreadlines() 行を読み取ったまま印刷した場合の入力データと結果の出力データの例。 ご覧のとおり、readlines() を使用すると、行全体が読み取られません。

あまり堅牢ではない私の文字列抽出アルゴリズム。 あまり堅牢ではない私の文字列抽出アルゴリズム。

参考までに、効率は必ずしもインポートではありません。

4

2 に答える 2

0

データがバイナリの場合は、テキストとして読み取らないでください。バイナリ データをそのまま読み取り、バイナリ データに埋め込まれた文字列を検索します。

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

終端文字に基づいてデータを分割します

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

できる限り各部分から文字列を抽出します。

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']
于 2016-05-03T19:35:17.330 に答える
0

Python を使用する理由。文字列を使用して、頭にパイプします。

    strings /bin/ls | head -3

そして何が得られるか見てください。Windows 用の文字列も入手できます。

于 2016-05-03T18:20:07.930 に答える