Python JPEG文件雕刻器在小转储上花费了难以置信的时间

Python JPEG文件雕刻器在小转储上花费了难以置信的时间,python,Python,我正在写一个JPEG文件雕刻器,作为法医实验室的一部分 任务是编写一个脚本,可以从10 MB dd转储中提取JPEG文件。我们不允许将文件分配给内存变量(因为如果它太大,将导致溢出),但是Python脚本应该直接从文件中读取 我的脚本似乎工作得非常好,但完成它需要非常长的时间(30-40分钟)。这是预期的行为吗?即使是这样一个10 MB的小文件?我能做些什么来缩短时间吗 这是我的代码: # Extract JPEGs from a file. import sys with open(sys.a

我正在写一个JPEG文件雕刻器,作为法医实验室的一部分

任务是编写一个脚本,可以从10 MB dd转储中提取JPEG文件。我们不允许将文件分配给内存变量(因为如果它太大,将导致溢出),但是Python脚本应该直接从文件中读取

我的脚本似乎工作得非常好,但完成它需要非常长的时间(30-40分钟)。这是预期的行为吗?即使是这样一个10 MB的小文件?我能做些什么来缩短时间吗

这是我的代码:

# Extract JPEGs from a file.
import sys
with open(sys.argv[1], "rb") as binary_file:
    binary_file.seek(0, 2)  # Seek the end
    num_bytes = binary_file.tell()  # Get the file size

    count = 0 # Our counter of which file we are currently extracting.
    for i in range(num_bytes):
        binary_file.seek(i)
        four_bytes = binary_file.read(4)    
        whole_file = binary_file.read()

        if four_bytes == b"\xff\xd8\xff\xd8" or four_bytes == b"\xff\xd8\xff\xe0" or four_bytes == b"\xff\xd8\xff\xe1":  # JPEG signature

            whole_file = whole_file.split(four_bytes)

            for photo in whole_file:
                count += 1
                name = "Pic " + str(count) + ".jpg"
                file(name, "wb").write(four_bytes+photo)
                print name

你不是在每个for循环上都读取整个文件吗

E:我的意思是,你读取整个文件的每个字节(对于一个10MB的文件,你正在读取10MB的1000万次,不是吗?),即使这四个字节与JPEG签名不匹配

E3:您需要在每个字节上检查是否有要写入的文件(检查头/签名)。如果匹配签名,则必须开始将字节写入文件,但首先,由于已经读取了4个字节,因此必须跳回原来的位置。然后,当读取字节并将其写入文件时,必须检查JPEG结尾。如果文件结束,您必须写入下一个字节并关闭流,然后再次开始搜索头。这不会从另一个JPEG中提取JPEG

import sys
with open("C:\\Users\\rauno\\Downloads\\8-jpeg-search\\8-jpeg-search.dd", "rb") as binary_file:
    binary_file.seek(0, 2)  # Seek the end
    num_bytes = binary_file.tell()  # Get the file size
    write_to_file = False
    count = 0 # Our counter of which file we are currently extracting.

    for i in range(num_bytes):
        binary_file.seek(i)

        if write_to_file is False:                
            four_bytes = binary_file.read(4)
            if four_bytes == b"\xff\xd8\xff\xd8" or four_bytes == b"\xff\xd8\xff\xe0" or four_bytes == b"\xff\xd8\xff\xe1":  # JPEG signature
                write_to_file = True
                count += 1
                name = "Pic " + str(count) + ".jpg"
                f = open(name,"wb")
                binary_file.seek(i)


        if write_to_file is True: #not 'else' or you miss the first byte
            this_byte = binary_file.read(1)
            f.write(this_byte)
            next_byte = binary_file.read(1) # assuming it does read next byte - i think "read" jumps the seeker (which is why you have .seek(i) at the beginning)
            if this_byte == b"\xff" and next_byte==b"\xd9" :
                f.write(next_byte)
                f.close()
                write_to_file = False

是的,你说得对。但是,如果我将其移出for循环(例如,在开头的
num\u bytes=binary\u file.tell()
之后,我会收到一个错误,它是这样说的:
Traceback(最后一次调用):file“Final.py”,第16行,in whole\u file=whole\u file.split(四个字节)AttributeError:“list”对象没有属性“split”
编辑了我的答案,因为我不知道我也可以评论:)似乎工作得更快,但是,由于某种原因,现在我得到了重复的图像。我认为它在if语句中?我相信这与整个文件被分割的方式以及您对它的迭代有关。然而,“我们不允许将文件分配给内存变量”——这不正是您使用“整个文件”所做的吗?嗯,您可能是对的。还有别的办法吗?