python 2.7.8
def file_by_block(file, begin, end):
with open(file, 'rb') as fp:
fp.seek(begin) #寻找文件中某个给定的位置
lenthofdata = end - begin #希望读取的大小
data = fp.read(lenthofdata)
with open('C:\\Users\\Administrator\\Desktop\\TEMP\\b.text', 'ab+') as fd:
fd.writelines(data)
无论用writelines还是write,用'a','ab','ab+',总是不能把data完整的写入到fd中。求高人指点,先谢!
多线程调用上面读取写入的部分:
def process_pid(pid, array, file, rlock):
'''
多个动作pid同时开动。
'''
FILE_SIZE = getFilesize(file)
while 1:
rlock.acquire()
begin = max(array)
end = array[pid] = (begin + BLOCKSIZE) if (begin + BLOCKSIZE) < FILE_SIZE else FILE_SIZE
rlock.release()
if begin == FILE_SIZE:
break
elif end < FILE_SIZE:
file_by_range(file, begin, end,pid)
elif end == FILE_SIZE:
file_by_range(file, begin, end,pid)
else:
break
def main():
file = "C:\\Users\\Administrator\\Desktop\\a.mkv"
FILE_SIZE = getFilesize(file)
rlock = RLock()
array = Array('l', WORKERS, lock=rlock)
threads = []
for i in range(WORKERS):
p = Process(target=process_pid(), args=[i, array, file, rlock])
threads.append(p)
for i in range(WORKERS):
threads[i].start()
for i in range(WORKERS):
threads[i].join()
print 'in main :', datetime.datetime.now().strftime("%Y-%d-%m %H:%M:%S")
if __name__ == '__main__':
main()
两种原因:
1.你没有计算了不可见字符比如回车换行?
2.你的源文件不是ANSI格式,有不可见文件头。
######感谢感谢! 在用read和write时没有计算不可见字符,源文件试用了wma和mkv文件。 打印了一下fd.tell() 的记录,发现是多线程时写入的位置似乎不对啊。新的问题来了。######你读wma、mkv文件为什么要用writelines啊???######随意找了俩文件充作数据源。writelines权当测试。######会有多余的\n出现吧######400MB的文件,做完上面的步骤之后,得到的文件缩水很多,并且还是随机的。######感谢各位!
根据fd.tell()给出的位置,判断问题出在rlock上,各个线程没有在其它线程结束时往文件里附加,这样fd.tell()的位置不在希望的位置上,数据变得不再准确。解决的思路是不往一个文件里写,而是每个新线程往各自新的文件里写。
######感谢各位!
根据fd.tell()给出的位置,判断问题出在rlock上,各个线程没有在其它线程结束时往文件里附加,这样fd.tell()的位置不在希望的位置上,数据变得不再准确。解决的思路是不往一个文件里写,而是每个新线程往各自新的文件里写。
根据fd.tell()给出的位置,判断问题出在rlock上,各个线程没有在其它线程结束时往文件里附加,这样fd.tell()的位置不在希望的位置上,数据变得不再准确。解决的思路是不往一个文件里写,而是每个新线程往各自新的文件里写。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。