2009-05-04 8 views
2

一部の.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`[email protected]`("`@,#`P$!`0+^_OW]_?_#P\*"@H.#@X-#0T&[email protected]!`0 
M$+"PL"`@('!P<)"0D#`P,%!04#\_/^_O[Y^?GZ^OK]_?WX^/C\_/SV]O;U]? 

は、私は簡単に十分な部分を見つける処理することができますが、どこGIFファイルが始まるん。ヘッダーは644で始まりますか、単語の後の空白はbeginか、MITEで始まる行ですか?

次に、ファイルをPythonに読み込むと、バイナリコードに何か処理が行われますが、これは読み返しても元に戻す必要がありますか?

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

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()) 

私は簡単に始める単語を取得するために同じプロセスを使用することができ、またはファイル名を特定し、中のファイル名の末尾に到達するために'最初の'行。私はまた、埋め込まれたgifファイルの最後まで順調に進んでいます。しかし、私は物事の正しい組み合わせを書くように見えないので、私はh65803h6580301.gifをダブルクリックすると、それが分離されて保存されたときにグラフィックを見ることができます。

興味深いことに、ファイルをrbで開くと、ノートパッドに効果がないように見えても、行末はまだ表示されているように見えます。だから、それは私の問題の一つは、私はreadlinesに必要な、私はこのサイトが大好きです\ nは

を除去した後、一緒にラインを結合する可能性が明確であり、私はこれは私がbendinの記事を読んでたら、あまりにも簡単だったPYTHON

大好きです。

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

私はその日、私の残りのためのいくつかの他のものと仕事をしなければならない:私はちょうど始まる言葉で始まった部分を切り取るとtxtファイルにそれを保存し、次のコマンドを実行する必要がありました私はこれをより詳しく見ると、ここに投稿されます。私が発見する必要があるのは、ファイル以外のものを使用する方法です。つまり、全体の.txtファイルをメモリに読み込んだり、クリップされたセクションで作業する必要があるイメージがあるセクションを切り取ってからtest2.txtに出力します。どうやってそれをやり遂げることができるのか、私は確信しています。

+0

私は、彼らがJPEGの埋め込まれている場合、彼らは.txtファイルを呼び出すことはできませんことを主張するだろう。 –

+0

これは私のファイルではありません。名前を変更したいのですが、彼らは何ですか? – PyNEwbie

+0

一時ファイルを避けるためのヒント:http://docs.python.org/library/codecs.html uu_codecの検索 – bendin

答えて

3

あなたが見ているのは「バイナリ」ではなく、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() 
+0

uuencodeをスキャンした後私はこの情報が大きな助けになることがわかります。ありがとう。私はブロックが切り抜かれて保存される準備ができていると仮定していました。 – PyNEwbie

+0

さて、私はケースに戻ってきて、これが甘いとあなたに伝えさせてください。また、ドキュメンテーションをよりよく理解するだけの十分なものをくれました。私は再びそれをマークしていただろうが、私はそれが起こったとは思わない。 – PyNEwbie

2

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

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

そこには例はありませんが、あなたがする必要があるのは、あなたが望むsgmlタグを扱うdo_メソッドをセットアップすることだけです。

0

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

関連する問題