В Python 2.6 или новее используйте format
синтаксис :
'{0:0=#10b}'.format(my_num)[2:]
# '00001010'
Одна из замечательных особенностей строк Python - это то, что они являются последовательностями. Если все, что вам нужно сделать, это перебрать символы, нет необходимости преобразовывать строку в список.
Редактировать : Для стеганографии вас может заинтересовать преобразование потока символов в поток битов. Вот как вы можете сделать это с генераторами:
def str2bits(astr):
for char in astr:
n=ord(char)
for bit in '{0:0=#10b}'.format(n)[2:]:
yield int(bit)
И преобразовать поток битов обратно в поток символов:
def grouper(n, iterable, fillvalue=None):
# Source: http://docs.python.org/library/itertools.html#recipes
"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
return itertools.izip_longest(*[iter(iterable)]*n,fillvalue=fillvalue)
def bits2str(bits):
for b in grouper(8,bits):
yield chr(int(''.join(map(str,b)),2))
Например, вы можете использовать вышеперечисленные функции следующим образом:
for b in str2bits('Hi Zvarberg'):
print b,
# 0 1 0 0 1 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 1 1 0 1 1 0 0 1 1 0 0 0 0 1 0 1 1 1 0 0 1 0 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 1 0 0 1 0 0 1 1 0 0 1 1 1
# To show bits2str is the inverse of str2bits:
print ''.join([c for c in bits2str(str2bits('Hi Zvarberg'))])
# Hi Zvarberg
Кроме того, SO гуру Нед Бэтчелдер проводит некоторые связанные с стеганографией эксперименты с использованием Python и PIL здесь . Вы можете найти там полезный код.
Если вам нужно больше скорости (и вы все еще хотите кодировать это на Python), вы можете использовать numpy .