在python3中,执行最后一部了,发现用for 循环改变buf的值,怎么都改变不了```会不会是n的值太大了,导致for循环没有遍历到末尾就结束了?

来源:5-2 如何处理二进制文件

qq_蜜思丹海天_0

2018-01-05

http://img.mukewang.com/szimg/5a4f66070001f3df19201080.jpg

写回答

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中的效果了!

亲测有效!

1
0

Python高效编程技巧实战

精选50个Python案例,源自实战,全面提升Python编程能力

2582 学习 · 360 问题

查看课程