2009-05-04 75 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開頭,單詞開頭之後的空白還是以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中打開文件時,即使它們在notebpad中似乎沒有任何效果,但行尾仍然存在。所以這顯然是我的一個問題,我可能需要改成readlines和剝出\ n

我喜歡這個網站後加入行在一起,我愛PYTHON

這太容易,一旦我讀bendin的職位。我不得不剪斷以單詞開始開始部分,並保存在一個txt文件,然後運行以下命令:

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

我有一些其他的東西,工作了一天,但我的休息當我更仔細地看這個時,我會在這裏發表更多的內容。我需要發現的第一件事是如何使用文件以外的內容,這是因爲我將整個.txt文件讀入內存,並刪除了具有需要使用裁剪部分而不是寫入內容的圖像的部分出來test2.txt。我相信,只要搞清楚如何去做就可以做到。

+0

我認爲,如果他們的嵌入式JPEG的,他們不應該被稱爲.txt文件。 – 2009-05-05 02:55:24

+0

嗯,他們不是我的文件我可以重命名他們任何我想要的,但他們是他們是什麼 – PyNEwbie 2009-05-05 15:26:27

回答

3

你正在看什麼不是「二元」,它是uuencoded。 Python的標準庫包含模塊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() 
2

如果內容包含JPEG圖像,則一定需要以二進制模式閱讀。

另外,Python包含一個SGML解析器,http://docs.python.org/library/sgmllib.html

這裏沒有例子,但你需要做的就是設置do_方法來處理你希望的sgml標籤。

0

您需要open(filename,'rb')以二進制模式打開文件。請注意,這會導致python在某些操作系統上給你帶來混淆的雙字節行結尾。

相關問題