如何将文件中的内容与二进制和其他形式的内容的容器分开

时间:2009-05-04 21:32:01

标签: python text encoding file binary

我正在尝试解析一些.txt文件。这些文件用作可变数量的“子”文件的容器,这些文件在容器内使用SGML标记进行设置或标识。使用python我可以轻松地分离子文件。但是我在将二进制内容写回二进制文件(比如gif或jpg)时遇到了麻烦。在最简单的情况下,容器可能有一个嵌入的html文件,后跟一个由html调用的图形。我假设我的问题是因为我正在使用open(filename,'r')读取原始的.txt文件。但这似乎是找到分割文件的sgml标签的唯一选择。

我很感激任何帮助,以确定一些相关的阅读材料。

我很欣赏这些建议,但我仍在努力解决最基本的问题。例如,当我用wordpad打开文件并向下滚动到标记为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$+"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())

我可以轻松地使用相同的过程来获取单词begin,或者识别文件名并在“first”行中到达文件名的末尾。我也成功地完成了嵌入式gif文件的结束。但是我似乎无法写出正确的组合,所以当我在h65803h6580301.gif被隔离并保存时双击它我会看到图形。

有趣的是,当我在rb中打开文件时,即使它们在notebpad中似乎没有任何效果,行结尾似乎仍然存在。所以这显然是我的一个问题,我可能需要读取并在剥离\ n

之后将这些行连接在一起

我喜欢这个网站,我喜欢PYTHON

一旦我读到bendin的帖子,这太容易了。我只需要剪切以单词begin开头的部分并将其保存在txt文件中,然后运行以下命令:

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

我必须在今天余下的时间里使用其他一些东西,但是我会在这里发布更多内容,因为我会更仔细地看一下。我需要发现的第一件事是如何使用除文件之外的其他东西,因为我将整个.txt文件读入内存并剪切出具有我需要处理剪切部分的图像的部分而不是写入它out to test2.txt。我相信它可以完成它只是弄清楚如何去做。

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:2)

如果内容包含JPEG图像,您肯定需要以二进制模式阅读。

同样,Python包含一个SGML解析器http://docs.python.org/library/sgmllib.html

那里没有例子,但你需要做的就是设置do_方法来处理你想要的sgml标签。

答案 2 :(得分:0)

您需要open(filename,'rb')以二进制模式打开文件。请注意,这将导致python在某些操作系统上为您提供令人困惑的双字节行结尾。