开发者社区> 问答> 正文

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

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

展开
收起
kun坤 2020-06-06 16:15:41 461 0
1 条回答
写回答
取消 提交回答
  • 两种原因:

    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()的位置不在希望的位置上,数据变得不再准确。解决的思路是不往一个文件里写,而是每个新线程往各自新的文件里写。

    2020-06-06 16:15:46
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载