Python - 从二进制文件中读取字符串

3

我需要读取二进制文件中某个特定字符串之前的内容,并对其后的字节进行操作。该字符串是'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。最终我一直在旋转 - 只是悬挂 - 当我读完整个文件时,我甚至没有获得退出。


你看过这个网站吗:https://dev59.com/iGw15IYBdhLWcg3wG4AJ? - Dr. Jan-Philip Gehrcke
@Jan-Philip - 谢谢!我应该看看如何调整其中一个。然而,首要的是,这个答案https://dev59.com/iGw15IYBdhLWcg3wG4AJ#6822761让我意识到我只是在deque的错误一侧添加,我的上述方法,在进行更正后,可以正常工作! - JStroop
2个回答

2
将你的bytes.appendleft()更改为bytes.append(),然后它就会起作用 - 对我而言是这样的。

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

逐行而非逐字节...不过无所谓... 我很难想象你的内存不足以容纳整个jpg文件... Python并不是一个优化内存或时间占用的绝佳语言 但对于功能需求来说确实很棒 :)


该文件大小超过37MB,而此字符串应小于60字节,因此我想知道在split()之后如何继续逐字节读取f - JStroop
@JStroop:f.read()会读取整个文件,所以只需将此数据存储在变量中,然后按照Joran的建议进行split(),之后继续处理数据。 - Dr. Jan-Philip Gehrcke
将整个文件读入内存绝对不是一个选项;特别是当我需要的一切都在前300个字节内时。 - JStroop
每分钟可能会有几百次,这看起来并不是很高效。感谢您的帮助! - JStroop
1
@JoranBeasley:关于从带有二进制数据的文件中逐行读取与一次性读取的区别:你只是希望偶然有很多位序列对应换行符吗?我认为这不是一个解决方案 :-) 可以看看https://dev59.com/oG455IYBdhLWcg3wD_sB -- 但是你会遇到在搜索的序列中间被分割的问题。我认为所有这些都不是有效的方法。正确的解决方案是“移动窗口”。 - Dr. Jan-Philip Gehrcke
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接