Python基于偏移量写入文件
问题描述:
我想创建一个python程序,它将文件分割成指定宽度的段,然后消费者程序获取段并创建原始文件的副本。段可能出现故障,所以我打算使用偏移值写入文件。 有没有一种方法可以实现这一点,而不需要创建一个本地数组来保存接收端的所有数据?Python基于偏移量写入文件
例如,
f = open(file, "wb")
f.seek(offset)
f.write(data)
这背后的想法是,发送该文件的程序可能无法完成发送的文件,一旦开始将再次恢复。 我有一个示例代码,其中“combine_bytes”函数在尝试将数据放入缓冲区位置时会引发异常。
import sys
import os
def SplitFile(fname, start, end, width):
t_fileSize = os.path.getsize(fname)
buffData = bytearray(t_fileSize)
for line, offset in get_bytes(fname, int(start), int(end), int(width)):
combine_bytes(buffData, offset, line, width)
nums = ["%02x" % ord(c) for c in line]
print " ".join(nums)
f = open("Green_copy.jpg", "wb")
f.write(buffData)
f.close()
def combine_bytes(in_buff, in_offset, in_data, in_width):
#something like memcpy would be nice
#in_buff[in_offset:in_offset + in_width] = in_data
#this works but it's the mother of inefficiency
i = in_offset
for c in in_data:
in_buff.insert(i, c)
i = i + 1
def get_bytes(fname, start, end, width):
t_currOffset = start
t_width = width
f = open(fname, "r+b")
if end != 0:
while t_currOffset < end:
f.seek(t_currOffset)
if (t_currOffset + t_width) > end:
t_width = end - t_currOffset
t_data = f.read(t_width)
yield t_data,t_currOffset
t_currOffset += t_width
else:
f.seek(t_currOffset)
t_data = f.read(t_width)
while t_data:
yield t_data, t_currOffset
t_currOffset += t_width
f.seek(t_currOffset)
t_data = f.read(t_width)
f.close()
if __name__ == '__main__':
try:
SplitFile(*sys.argv[1:5])
except:
print "Unexpected error:", sys.exc_info()[0]
答
找到了。这是一种更好的方式,可以产生我想要的和更快的。 _buffData[t_offset:t_offset + len(t_data)] = bytearray(t_data)
答
我仍然NT弄清楚什么是你的意图 - 不过这个版本的combine_bytes
将摆脱你的一部分“的低效之母”的(这实际上正是)
def combine_bytes(in_buff, in_offset, in_data, in_width):
#something like memcpy would be nice
#in_buff[in_offset:in_offset + in_width] = in_data
in_buff = in_buff[:in_offset] + in_data + in_buff[in_offset:]
return in_buff
中当然,这会为每个调用一个新的(大)缓冲区,你必须更换与一个呼叫者范围的缓冲区返回:
buffData = combine_bytes(buffData, offset, line, width)
让您为添加更多信息而添加。现在,您的代码中存在几个缩进错误,这些错误使其难以理解或测试。 (像第一个'for'内的combine_bytes调用 - 它应该缩进另一个层次) – jsbueno