2011-04-24 60 views
4

问题出在这里:我正在以相当大的块(512 KiB)读取二进制文件,并希望每块块的长度小于块大小时将最后一块填充到零。Python - 什么是生成填充最有效的方法?

目前,我正在做这样的事情:

bytes = f.read(self.chunksize) 
if len(bytes) > 0: 
    len_diff = self.chunksize - len(bytes) 
    if len_diff > 0: 
     bytes += reduce(lambda x,y: x+y, ["\0" for i in range(0, len_diff)]) 

显然,这是非常低效的,因为这降低将使很多的字符串连接的。我想知道,我怎样才能用Python实现这一点?在C中,我只是简单地使用calloc并完成它。

如果使用Python无法实现,我愿意将此代码转换为C模块和/或完全放弃此项目的Python,因为它仍处于早期阶段。

干杯!

编辑:我不记得使用*运算符感觉很糟糕。 :-)

该解决方案完全为我工作:

bytes += "\0" * len_diff 

编辑#2:使用ljust(),而不是简化我的代码位,所以正确答案去杰夫。

+0

http://docs.python.org/library/mmap.html – 2011-04-24 22:24:13

回答

12

你不能只是使用ljust()做填充,因为我们正在处理的String对象吗?

bytes = f.read(self.chunksize) 
if bytes: 
    bytes = bytes.ljust(self.chunksize, '\0') 
+0

太棒了!正是我在找的东西。这些天我没有做太多的字符串操作。 :P – 2011-04-24 22:37:27

2
bytes += "\0"*len_diff 

应该帮助

+0

我甚至觉得先不考虑这个问题。 :)只要SO让我接受就会接受。 – 2011-04-24 22:29:33

+0

对不起,为@Jeff提供的解决方案实际上就是我正在寻找的东西,更不用说了。尽管如此,这个也是有效的。 :) – 2011-04-24 22:36:57

2

尝试。

bytes = "\0" * self.chunksize 
rbytes = f.read(self.chunksize) 
bytes[:len(rbytes)] = rbytes 

bytes = f.read(self.chunksize) 
bytes += "\0" * (self.chunksize - len(bytes)) 
2

如何:

bytes += "\0"*len_diff 
相关问题