问题在于:我正在以相当大的块(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()代替我的代码,所以正确答案归杰夫所有。
答案 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)