【问题标题】:Python - Read string from binary filePython - 从二进制文件中读取字符串
【发布时间】:2012-09-05 20:29:15
【问题描述】:

我需要读取二进制文件中某个字符串的位置,然后对后面的字节进行操作。字符串是 'colr'(这是一个 JPEG 2000 文件),这是我目前所拥有的:

from collections import deque

f = open('my.jp2', 'rb')
bytes =  deque([], 4)
while ''.join(map(chr, bytes)) != 'colr':
    bytes.appendleft(ord(f.read(1)))

如果可行:

bytes =  deque([0x63, 0x6F, 0x6C, 0x72], 4)
print ''.join(map(chr, bytes))

(返回“colr”),我不确定为什么我的循环中的测试永远不会评估为True。我开始旋转 - 只是挂起 - 当我通读整个文件时,我什至没有退出。

【问题讨论】:

标签: python


【解决方案1】:

将您的 bytes.appendleft() 更改为 bytes.append() 然后它会起作用 - 它对我有用。

【讨论】:

    【解决方案2】:
      with open("my.jpg","rb") as f:
           print f.read().split("colr",1)
    

    如果你不想一次读完……那么

    def preprocess(line):
        print "Do Something with this line"
    def postprocess(line):
        print "Do something else with this line"
    currentproc = preprocess
    with open("my.jpg","rb") as f:
       for line in f:
           if "colr" in line:
               left,right = line.split("colr")
               preprocess(left)
               postprocess(right) 
               currentproc= postprocess
            else:
               currentproc(line)
    

    它是逐行而不是逐字节...但是meh ... 我很难想到你没有足够的 ram 来将整个 jpg 保存在内存中...... python 并不是一种真正的语言,可以最大限度地减少内存或时间足迹 但它对于功能需求来说很棒:)

    【讨论】:

    • 这可以工作,但我应该更清楚我需要继续阅读文件,提取其他信息。如果可能的话,您愿意详细说明一下我如何继续阅读文件对象吗?
    • 文件>37 MB,并且这个字符串应该小于60字节左右,所以我想知道我如何在@987654325之后继续逐字节读取f @
    • @JSroop: f.read() 读取整个文件,因此只需将此数据存储在一个变量中,然后按照 Joran 的建议将 split() 存储起来,然后继续处理数据。
    • @JSroop,如果你的文件那么大,我同意,在处理它之前立即将它读入内存可能不是最好的主意。不过,这取决于您的申请详情。
    • @JoranBeasley:关于从具有二进制数据的文件中逐行读取与一次全部读取:您是否只是希望偶然有很多位序列对应于换行符?我认为这不是一个解决方案 :-) 看看stackoverflow.com/questions/4566498/…——但是你有一个问题,你可以在中间拆分搜索的序列。我认为所有这些都不是一个有效的方法。正确的解决方案是“移动窗口”。
    猜你喜欢
    • 2014-06-18
    • 2021-11-09
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多