在python3中,执行最后一部了,发现用for 循环改变buf的值,怎么都改变不了```会不会是n的值太大了,导致for循环没有遍历到末尾就结束了?
来源:5-2 如何处理二进制文件

qq_蜜思丹海天_0
2018-01-05
写回答
1回答
-
qq_蜜思丹海天_0
提问者
2018-01-05
找到原因了!
问题出在这一句 buf = array.array('h', (0 for _ in range(n)))
这个相当于创建了一个长度为n,元素全为0的迭代器使用f.readinto(buf)语句时,他会把迭代器中的0都替换成f里面的数据,替换完毕后长度仍为n
而在python3中,readinto被废弃,我们可以采用array.fromfile(f, n)方法来达成类似效果
如buf.fromfile(f, n)
这里非常值得注意的是,fromfile方法会把f中的n个元素 拼接 到 buf,而不是 替换!
这样执行完这条语句后,buf的长度实际变成了2n,所以当我进行图示遍历时,实际上是对前面n个0做了除8操作! 没有遍历到倒数第二个值,自然就没有改变!
由此分析,在python3中,只需把 buf = array.array('h', (0 for _ in range(n))) 修改为
buf = array.array('h', []) 把f.readint(buf) 改为 buf.fromfile(f, n)(执行该语句前先执行f.seek(44)语句),
这样就能达到python2中的效果了!
亲测有效!
10
相似问题