我从二进制文件中提取ascii头文件。它似乎不是一个固定的大小,所以我不能依靠精确的字节偏移来提取这个标题。根据我的收集情况,标题从第一次出现\x0a\x23
开始,到此后的第一个\x00\x00
结束。所以我只是阅读每个文件并应用正则表达式来提取我想要的东西。
在没有实际读取文件的情况下,有更快的方法吗? (现在,我看到的唯一改进就是将读数限制在一个足够大的固定大小,以确保我得到标题但不读取整个文件,但这看起来并不是一个巨大的改进)
注意:我会读取数十(甚至数百甚至)数千个文件,因此欢迎使用任何微优化来尽可能快地编写代码。
这是我的代码:
import re
# Header starts at the first \x0a\x23 occurrence and ends at the first following \x00\x00
HEADER_RE = re.compile(b'(\x0a\x23.+?)\x00\x00', re.DOTALL)
def get_header(file_path):
with open(file_path, 'rb') as file:
data = file.read() #TODO: read only the first x bytes: file.read(x)
try:
header = HEADER_RE.search(data).group(0)
except AttributeError:
header = b''
return header