python 读取数据再写入,文件大小总会出现变差?

查询结果成为数据源 发布于 2014/10/30 02:24
阅读 816
收藏 0

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

加载中
0
s
seanzzz

两种原因:

1.你没有计算了不可见字符比如回车换行?

2.你的源文件不是ANSI格式,有不可见文件头。

查询结果成为数据源
查询结果成为数据源
感谢感谢! 在用read和write时没有计算不可见字符,源文件试用了wma和mkv文件。 打印了一下fd.tell() 的记录,发现是多线程时写入的位置似乎不对啊。新的问题来了。
0
asdfsx
asdfsx
你读wma、mkv文件为什么要用writelines啊???
查询结果成为数据源
查询结果成为数据源
随意找了俩文件充作数据源。writelines权当测试。
0
asdfsx
asdfsx
会有多余的\n出现吧
查询结果成为数据源
查询结果成为数据源
400MB的文件,做完上面的步骤之后,得到的文件缩水很多,并且还是随机的。
0
查询结果成为数据源
查询结果成为数据源

感谢各位!

根据fd.tell()给出的位置,判断问题出在rlock上,各个线程没有在其它线程结束时往文件里附加,这样fd.tell()的位置不在希望的位置上,数据变得不再准确。解决的思路是不往一个文件里写,而是每个新线程往各自新的文件里写。

0
查询结果成为数据源
查询结果成为数据源

引用来自“查询结果成为数据源”的评论

感谢各位!

根据fd.tell()给出的位置,判断问题出在rlock上,各个线程没有在其它线程结束时往文件里附加,这样fd.tell()的位置不在希望的位置上,数据变得不再准确。解决的思路是不往一个文件里写,而是每个新线程往各自新的文件里写。

感谢各位!

根据fd.tell()给出的位置,判断问题出在rlock上,各个线程没有在其它线程结束时往文件里附加,这样fd.tell()的位置不在希望的位置上,数据变得不再准确。解决的思路是不往一个文件里写,而是每个新线程往各自新的文件里写。

返回顶部
顶部