Python — Какой наиболее эффективный способ генерировать отступы?

#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. docs.python.org/library/mmap.html

Ответ №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)