16

Here's the problem: I'm reading binary files in fairly large blocks (512 KiB) and wish to pad the last block with zeros whenever it is shorter than the block size.

Currently, I'm doing something like this:

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)]) 

Obviously this is terribly inefficient since that reduce will make a lot of string concatenations. I'm wondering though, how can I achieve this with Python? In C, I'd simply calloc and be done with it.

If it isn't achievable with Python, I'm willing to convert this code into a C module and/or abandon Python entirely for this project, since it's still on the early stages.

Cheers!

EDIT: I'm feeling terrible for not remembering to use the * operator. :-)

This solution worked perfectly for me:

bytes += "\0" * len_diff 

EDIT #2: Using ljust() instead simplified my code a bit, so the correct answer goes to Jeff.

1

5 Answers 5

32

Since you're working with strings, you can use ljust() to do the padding.

readBytes = f.read(self.chunksize) if readBytes: readBytes = readBytes.ljust(self.chunksize, b'\0') 
Sign up to request clarification or add additional context in comments.

2 Comments

Awesome! Just what I was looking for. I don't do much string manipulation these days. :P
In Python 3, the second parameter to ljust must be b'\0'.
7
bytes += "\0"*len_diff 

should help

2 Comments

I even feel bad for not thinking about this first. :) Will accept as soon as SO lets me.
Sorry, the solution given for @Jeff is actually what I was looking for, much less hackish. This one works too, though. :)
2

try this.

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

or

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

Comments

2

How about:

bytes += "\0"*len_diff 

Comments

2

I needed to pad something encrypted. Here's how to do it.

from Crypto.Util.Padding import pad ... _bytes = pad(_bytes, block_size) 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.