Python - 生成填充的最有效方法是什么?

时间:2011-04-24 22:18:53

标签: python padding

问题在于:我正在以相当大的块(512 KiB)读取二进制文件,并且希望只要它比块大小短,就用零填充最后一个块。

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

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()代替我的代码,所以正确答案归杰夫所有。

5 个答案:

答案 0 :(得分:16)

你不能只使用ljust()来填充,因为我们在这里处理字符串对象吗?

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

答案 1 :(得分:5)

bytes += "\0"*len_diff 

应该帮助

答案 2 :(得分: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))

答案 3 :(得分:2)

怎么样:

bytes += "\0"*len_diff

答案 4 :(得分:1)

我需要填充一些加密的东西。这是这样做的方法。

from Crypto.Util.Padding import pad

...
_bytes = pad(_bytes, block_size)