Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用自定义行终止符读取二进制大文件,并在python中以较小的块写入_Python_Python 2.7_File - Fatal编程技术网

使用自定义行终止符读取二进制大文件,并在python中以较小的块写入

使用自定义行终止符读取二进制大文件,并在python中以较小的块写入,python,python-2.7,file,Python,Python 2.7,File,我有一个文件使用\x01作为行终止符。也就是说,行终止符不是换行符,而是字节值001。它的ascii表示形式为^A 我想将文件拆分为每个10 MB的大小。 这是我想到的 size=10000 #10 MB i=0 with open("in-file", "rb") as ifile: ofile = open("output0.txt","wb") data = ifile.read(size) while data: ofile.wri

我有一个文件使用\x01作为行终止符。也就是说,行终止符不是换行符,而是字节值001。它的ascii表示形式为^A

我想将文件拆分为每个10 MB的大小。 这是我想到的

size=10000 #10 MB
i=0
with open("in-file", "rb") as ifile:
    ofile = open("output0.txt","wb")
    data = ifile.read(size)
        while data:
            ofile.write(data)
            ofile.close()
            data = ifile.read(size)
            i+=1 
            ofile = open("output%d.txt"%(i),"wb")


    ofile.close()
但是,这将导致文件在任意位置被破坏。
我希望文件仅在字节值001处终止,下一次读取从下一个字节恢复。

如果只有一个字节的终端,您可以执行以下操作

def read_line(f_object,terminal_byte): # its one line you could just as easily do this inline
    return "".join(iter(lambda:f_object.read(1),terminal_byte))
with open("my_binary.dat","rb") as f_in:
    for i,chunk in enumerate(make_chunks(f_in,"\x01",1024*1000*10)):
        with open("out%d.dat"%i,"wb") as f_out:
            f_out.write(chunk)
然后创建一个helper函数来读取文件中的所有行

def read_lines(f_object,terminal_byte):
    tmp = read_line(f_object,terminal_byte)
    while tmp:
        yield tmp
        tmp = read_line(f_object,terminal_byte)
然后创建一个函数,将其分块

def make_chunks(f_object,terminal_byte,max_size):
    current_chunk = []
    current_chunk_size = 0
    for line in read_lines(f_object,terminal_byte):
        current_chunk.append(line)
        current_chunk_size += len(line)
        if current_chunk_size > max_size:
            yield "".join(current_chunk)
            current_chunk = []
            current_chunk_size = 0
    if current_chunk:
        yield "".join(current_chunk)
那就做点像

def read_line(f_object,terminal_byte): # its one line you could just as easily do this inline
    return "".join(iter(lambda:f_object.read(1),terminal_byte))
with open("my_binary.dat","rb") as f_in:
    for i,chunk in enumerate(make_chunks(f_in,"\x01",1024*1000*10)):
        with open("out%d.dat"%i,"wb") as f_out:
            f_out.write(chunk)

可能有一些方法可以通过库实现这一点,甚至是一种很棒的内置方式,但我不知道有任何即时的方法

字节是否刚刚\x01?@JoranBeasley yesIt似乎没有在终端字节上拆分。我使用的终端字节是byteschr1I,我刚刚注意到终端字节没有写入输出文件。我想加入\x01I modified.joiniterlambda:f_object.read1,terminal_byte到\x01.joiniterlambda:f_object.read1,terminal_byte并产生\x01.joincurrent_块。但那不起作用那不起作用是什么意思?您可能只是想要\x01.joincurrent\u chunk+\x01,但它不起作用。然而,这起了作用。def read_linef_对象,终端字节:return.joiniterlambda:f_对象。read1,终端字节+\x01