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

时间:2017-08-25 19:13:07

标签: python python-2.7 file

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

我想将文件分割为每个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的字节值处终止,然后从下一个字节继续读取。

1 个答案:

答案 0 :(得分:1)

如果它只是一个字节的终端,你可以做类似的事情

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

然后创建一个帮助函数,它将读取文件中的所有行

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)

然后做一些像

这样的事情
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)

可能有一些方法可以用库(甚至是一种很棒的内置方式)来做这件事,但我不知道任何随便的