#python #padding
#python #заполнение
Вопрос:
Вот проблема: я читаю двоичные файлы в довольно больших блоках (512 КБ) и хочу дополнять последний блок нулями всякий раз, когда он короче размера блока.
В настоящее время я делаю что-то вроде этого:
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, ["" for i in range(0, len_diff)])
Очевидно, что это ужасно неэффективно, поскольку такое уменьшение приведет к большому количеству конкатенаций строк. Однако мне интересно, как я могу достичь этого с помощью Python? На C я бы просто вызвалoc и покончил с этим.
Если это невозможно с помощью Python, я готов преобразовать этот код в модуль C и / или полностью отказаться от Python для этого проекта, поскольку он все еще находится на ранних стадиях.
Приветствия!
РЕДАКТИРОВАТЬ: Я чувствую себя ужасно из-за того, что не помню использовать оператор * . 🙂
Это решение отлично сработало для меня:
bytes = "" * len_diff
ПРАВКА # 2: использование вместо этого ljust() немного упростило мой код, поэтому правильный ответ достается Джеффу.
Комментарии:
Ответ №1:
Поскольку вы работаете со строками, вы можете использовать ljust()
для выполнения отступов.
readBytes = f.read(self.chunksize)
if readBytes:
readBytes = readBytes.ljust(self.chunksize, b'')
Комментарии:
1. Потрясающе! Именно то, что я искал. В наши дни я не слишком много манипулирую строками. 😛
2. В Python 3 вторым параметром для ljust должно быть
b''
.
Ответ №2:
bytes = ""*len_diff
должно помочь
Комментарии:
1. Я даже чувствую себя плохо из-за того, что не подумал об этом первым. 🙂 Приму, как только это позволит мне.
2. Извините, решение, данное для @Jeff, на самом деле то, что я искал, гораздо менее хакерское. Впрочем, этот тоже работает. 🙂
Ответ №3:
попробуйте это.
bytes = "" * self.chunksize
rbytes = f.read(self.chunksize)
bytes[:len(rbytes)] = rbytes
или
bytes = f.read(self.chunksize)
bytes = "" * (self.chunksize - len(bytes))
Ответ №4:
Как насчет:
bytes = ""*len_diff
Ответ №5:
Мне нужно было добавить что-то зашифрованное. Вот как это сделать.
from Crypto.Util.Padding import pad
...
_bytes = pad(_bytes, block_size)