Новый (в 2014 году) tidyr
пакет также делает это просто, при этом gather()
/ spread()
является слагаемыми для melt
/ cast
.
library(tidyr)
spread(dat1, key = numbers, value = value)
Из github ,
tidyr
- это перерисовкаreshape2
, предназначенная для сопровождения аккуратной структуры данных и работающая рука об руку сmagrittr
иdplyr
, чтобы построить сплошной конвейер для анализа данных.Так же, как
blockquote>reshape2
сделал меньше, чем изменение,tidyr
делает меньше, чемreshape2
. Он разработан специально для сбора данных, а не для общей перестройки, которую делаетreshape2
, или общего преобразования, которое изменилось. В частности, встроенные методы работают только для кадров данных, аtidyr
не содержит полей или агрегации.
Поскольку Python 3.5, наконец, уже не является неудобным:
>>> b'\xde\xad\xbe\xef'.hex()
'deadbeef'
и reverse:
>>> bytes.fromhex('deadbeef')
b'\xde\xad\xbe\xef'
также работает с изменяемым типом bytearray
.
его можно использовать спецификатор формата %x02
, который форматирует и выводит шестнадцатеричное значение. Например:
>>> foo = b"tC\xfc}\x05i\x8d\x86\x05\xa5\xb4\xd3]Vd\x9cZ\x92~'6"
>>> res = ""
>>> for b in foo:
... res += "%02x" % b
...
>>> print(res)
7443fc7d05698d8605a5b4d35d56649c5a927e2736
Используйте модуль binascii
:
>>> import binascii
>>> binascii.hexlify('foo'.encode('utf8'))
b'666f6f'
>>> binascii.unhexlify(_).decode('utf8')
'foo'
См. этот ответ: Python 3.1.1 string to hex
str
, а bytes
. Я знаю, что OP кажется счастливым с ответом, но не будет лучше расширить этот ответ, включив .decode("ascii")
также, чтобы преобразовать его в строку & quot;
– ecerulm
8 June 2015 в 17:11
bytes
. Если вы print(b'666f6f')
, вы получите b
в распечатке. Если вы .decode("ascii")
, то вы этого не сделаете. Просто подумайте о том, как те, которые на самом деле имели bytes
(истинный двоичный код с элементами & gt; 128, а не строку ascii), хотели распечатать его.
– ecerulm
9 June 2015 в 05:52
Метод binascii.hexlify()
преобразует bytes
в bytes
, представляющий шестнадцатеричную строку ascii. Это означает, что каждый байт на входе будет преобразован в два символа ascii. Если вы хотите получить истинный str
, вы можете .decode("ascii")
получить результат.
Я включил фрагмент, который иллюстрирует его.
import binascii
with open("addressbook.bin", "rb") as f: # or any binary file like '/bin/ls'
in_bytes = f.read()
print(in_bytes) # b'\n\x16\n\x04'
hex_bytes = binascii.hexlify(in_bytes)
print(hex_bytes) # b'0a160a04' which is twice as long as in_bytes
hex_str = hex_bytes.decode("ascii")
print(hex_str) # 0a160a04
из шестнадцатеричной строки "0a160a04"
to может вернуться к bytes
с binascii.unhexlify("0a160a04")
, которая возвращает b'\n\x16\n\x04'
Python имеет стандартные кодеки с байтами для байтов , которые выполняют удобные преобразования, такие как кавычки для печати (вписываются в 7bits ascii), base64 (вписываются в буквенно-цифровые), hex escaping, gzip и bz2 compression. В Python 2 вы можете сделать:
b'foo'.encode('hex')
В Python 3, str.encode
/ bytes.decode
строго предназначены для преобразований байтов & lt; -> str. Вместо этого вы можете сделать это, которое работает через Python 2 и Python 3 ( s / encode / decode / g для обратного):
import codecs
codecs.getencoder('hex')(b'foo')[0]
Начиная с Python 3.4, существует менее неудобная опция:
codecs.encode(b'foo', 'hex')
Эти кодеки доступны также в своих собственных модулях (base64, zlib, bz2, uu, quopri, binascii); API менее согласован, но для кодеков сжатия он предлагает больше контроля.
LookupError: unknown encoding: hex
– Janus Troelsen
6 March 2014 в 00:37
binascii.hexlify(b'foo')
напрямую
– jfs
18 March 2014 в 10:04
Если вы хотите преобразовать b '\ x61' в 97 или '0x61', вы можете попробовать следующее:
[python3.5]
>>>from struct import *
>>>temp=unpack('B',b'\x61')[0] ## convert bytes to unsigned int
97
>>>hex(temp) ##convert int to string which is hexadecimal expression
'0x61'
Ссылка: https://docs.python.org/ 3,5 / библиотека / struct.html
import codecs
codecs.getencoder('hex_codec')(b'foo')[0]
работает в Python 3.3 (так что «hex_codec» вместо «hex»).
ОК, следующий ответ немного за пределами области видимости, если вы только заботитесь о Python 3, но этот вопрос является первым хитом Google, даже если вы не указали версию Python, так что это способ, который работает как на Python 2 и Python 3.
Я также интерпретирую вопрос о преобразовании байтов в тип str
: байты на Python 2 и Unicode- y на Python 3.
Учитывая, что лучший подход, который я знаю, это:
import six
bytes_to_hex_str = lambda b: ' '.join('%02x' % i for i in six.iterbytes(b))
Следующее утверждение будет верно для Python 2 или Python 3, предполагая, t активировал будущее unicode_literals
в Python 2:
assert bytes_to_hex_str(b'jkl') == '6a 6b 6c'
(Или вы можете использовать ''.join()
, чтобы опустить пробел между байтами и т. д.)
bytes.fromhex()
также доступен на Python 3.0+ (не только 3.5+).bytes.hex()
работает только на Python 3.5+. – phoenix 13 June 2018 в 14:16