В Python строка '\x31\x32\x33'
на самом деле только три символа '\x31'
есть символ с порядковым 0x31 (49), так что '\x31'
эквивалентен '1'
. Похоже, что ваш файл на самом деле содержит 12 символов \x31\x32\x33
, что эквивалентно строке Python '\\x31\\x32\\x33'
, где экранированные обратные косые черты представляют собой один символ обратной косой черты (это также может быть представлено строковым литералом r'\x31\x32\x33'
).
Если вы действительно уверены, что эти данные должны быть '123'
, вам необходимо посмотреть, как этот файл записывается. Если это то, что вы можете контролировать, тогда вы должны обратиться к нему туда, чтобы в итоге не было данных, состоящих из нескольких байтов, представляющих шестнадцатеричные escape-последовательности.
Возможно также, что все, что записывает эти данные, уже использует некоторый формат обмена данными (аналогично JSON), и в этом случае вам не нужно изменять способ его написания, вам просто нужно использовать декодер для этого формата обмена данными (например, json.loads()
, но это не JSON).
Если как-то ни один из выше действительно то, что вы хотите, и вы просто хотите, чтобы выяснить, как преобразовать строку как r'\x31\x32\x33'
в '123'
в Python, вот как вы можете это сделать:
>>> r'\x31\x32\x33'.decode('string_escape')
'123'
Или на Python 3.х:
>>> br'\x31\x32\x33'.decode('unicode_escape')
'123'
редактировать: Основываясь на комментариях, похоже, вы фактически получаете шестнадцатеричные строки, как '313233'
, чтобы преобразовать строку типа, что '123'
можно расшифровать с помощью шестигранного:
>>> '313233'.decode('hex')
'123'
Или на Python 3.x:
>>> bytes.fromhex('313233').decode('utf-8')
'123'
Как сохранить данные в файле. Кроме того, что он говорит, когда вы делаете «len (data)»? –
Кажется, вы создали файл, содержащий 6 символов, а не 3 байта, как вы ожидали. –
Вы не должны ** использовать его, но 'print (eval (" '"+ data +"' "))' будет делать это. – Sinkingpoint