バイナリおよび他の形式のコンテンツのコンテナであるファイルからコンテンツを分離する方法

StackOverflow https://stackoverflow.com/questions/822161

質問

.txtファイルを解析しようとしています。これらのファイルは、SGMLタグでコンテナー内で設定または識別される可変数の「子」ファイルのコンテナーとして機能します。 pythonを使用すると、子ファイルを簡単に分離できます。しかし、バイナリコンテンツ(たとえば、gifやjpg)としてバイナリコンテンツを書き戻すのに問題があります。最も単純なケースでは、コンテナにhtmlファイルが埋め込まれ、その後にhtmlによって呼び出されるグラフィックが続く場合があります。私の問題は、open(filename、 'r')を使用して元の.txtファイルを読んでいるからだと考えています。しかし、ファイルを分割するsgmlタグを見つける唯一のオプションのようです。

関連する読み物を特定するための助けをいただければ幸いです。

提案に感謝しますが、最も基本的な質問にまだ苦労しています。たとえば、ワードパッドでファイルを開き、gifとしてタグ付けされたセクションまでスクロールすると、次のように表示されます。

<FILENAME>h65803h6580301.gif
<DESCRIPTION>GRAPHIC
<TEXT>
begin 644 h65803h6580301.gif
M1TE&.#EA(P)I`=4@`("`@,#`P$!`0+^_OW]_?_#P\*"@H.#@X-#0T&!@8!`0
M
filerefbin=file('myfile.txt','rb')
wholeFile=filerefbin.read()
import re
graphicReg=re.compile('<DESCRIPTION>GRAPHIC')
locationGraphics=graphicReg.finditer(wholeFile)
graphicsTags=[]
for match in locationGraphics:
    graphicsTags.append(match.span())
"PL"`@('!P<)"0D#`P,%!04#\_/^_O[Y^?GZ^OK]_?WX^/C\_/SV]O;U]?

セクションの検索は簡単に処理できますが、gifファイルはどこから始まりますか。ヘッダーは644で始まり、単語の先頭の空白、またはMITEで始まる行ですか?

次に、ファイルがpythonに読み込まれたとき、バイナリコードが読み取られたときに元に戻す必要がありますか?

グラフィックが始まる行を見つけることができます:

import uu
uu.decode(r'c:\test2.txt',r'c:\test.gif')

同じプロセスを使用して、beginという単語を取得したり、ファイル名を識別して「最初の」行のファイル名の末尾を取得したりするのは簡単です。また、埋め込みgifファイルの最後まで成功しました。しかし、適切な組み合わせを書き出すことができないため、h65803h6580301.gifをダブルクリックして、それが分離されて保存されたら、グラフィックが表示されます。

興味深いことに、rbでファイルを開くと、notebpadには何の効果もないように見えますが、行末はまだ存在しているように見えます。だから、これは明らかに私の問題の1つです。\ n

を削除した後、readlinesと行を結合する必要があるかもしれません

このサイトが大好きで、PYTHONが大好きです

これは、bendinの投稿を読んだ後は簡単すぎました。 beginという単語で始まるセクションを切り取り、txtファイルに保存して、次のコマンドを実行する必要がありました。

<*>

残りの時間は他のスタッフと協力する必要がありますが、これをより詳しく見ていくため、ここに投稿します。私が最初に発見する必要があるのは、ファイル以外の何かを使用する方法です。つまり、.txtファイル全体をメモリに読み込み、それを書き込むのではなく、クリップしたセクションで作業する必要がある画像があるセクションを切り取ったからですtest2.txtに出力します。私はそれを行う方法を見つけ出すだけでそれを行うことができると確信しています。

役に立ちましたか?

解決

見ているのは「バイナリ」ではなく、 uuencoded 。 Pythonの標準ライブラリには、uuencodeされたデータを処理するためのモジュール uu が含まれています。

uu モジュールでは、エンコードに一時ファイルを使用する必要がありますおよびデコード。 Pythonの codecs モジュールを使用すると、一時ファイルに頼らずにこれを実現できます。

import codecs

data       = "Let's just pretend that this is binary data, ok?"
uuencode   = codecs.getencoder("uu")
data_uu, n = uuencode(data)
uudecode   = codecs.getdecoder("uu")
decoded, m = uudecode(data_uu)

print """* The initial input:
%(data)s
* Encoding these %(n)d bytes produces:
%(data_uu)s
* When we decode these %(m)d bytes, we get the original data back:
%(decoded)s""" % globals()

他のヒント

コンテンツにJPEG画像が含まれている場合は、必ずバイナリモードで読む必要があります。

同様に、PythonにはSGMLパーサー http://docs.python.org/が含まれています。 library / sgmllib.html

例はありませんが、必要なのは、do_メソッドをセットアップして、希望するsgmlタグを処理することだけです。

バイナリモードでファイルを開くには、 open(filename、 'rb')が必要です。これにより、一部のオペレーティングシステムでpythonが混乱を招く2バイトの行末を表示することに注意してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top