【问题标题】:How to separate content from a file that is a container for binary and other forms of content如何从作为二进制和其他形式内容容器的文件中分离内容
【发布时间】:2010-10-23 18:10:29
【问题描述】:

我正在尝试解析一些 .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$+"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 中打开文件时,行尾似乎仍然存在,即使它们在记事本中似乎没有任何影响。所以这显然是我的问题之一,我可能需要在删除 \n

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

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

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

我必须在剩下的时间里处理一些其他的事情,但我会在这里发布更多内容,因为我会更仔细地研究这个。我需要发现的第一件事是如何使用文件以外的东西,那是因为我将整个 .txt 文件读入内存并剪掉了具有我需要使用剪裁部分而不是写入它的图像的部分到 test2.txt。我相信只要弄清楚如何去做就可以做到。

【问题讨论】:

  • 我认为如果它们嵌入了 JPEG,它们不应该被称为 .txt 文件。
  • 好吧,它们不是我的文件,我可以随意重命名它们,但它们就是它们的本来面目
  • 提示避免临时文件:docs.python.org/library/codecs.html 搜索 uu_codec

标签: python text encoding file binary


【解决方案1】:

您看到的不是“二进制”,而是 uuencoded。 Python 的标准库包含模块 uu,用于处理 uuencoded 数据。

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

【讨论】:

  • 扫描 uuencode 的东西后,我可以看到这些信息将是一个很大的帮助。谢谢。我一直假设该块已准备好被剪切和保存。
  • 好的,我回到这个案子上,让我告诉你这很甜蜜。此外,您给了我足够的帮助,以便更好地理解文档。我会再次标记它,但我不认为会发生这种情况。
【解决方案2】:

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

Python 还包括一个 SGML 解析器 http://docs.python.org/library/sgmllib.html

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      • 2015-10-17
      相关资源
      最近更新 更多