Я конвертирую шестнадцатеричное число в ASCII и печатаю его прямо на экране. Но вместо перехода к следующей строке я получаю '\ n' на моей консоли вывода. Не могли бы вы заглянуть в мой код и сказать мне, почему я получил это?

Шестнадцатеричные значения хранятся в файле с именем «hexa».

fin = open('hexa', 'r') 
hexlist = fin.readline().split(' ')
for i in hexlist:
    print(str(codecs.decode(i, 'hex')).strip("b'"), end='')
fin.close()

Это вывод, который я получаю:

someRandomChanracters_._.\n\nOnly

Но мой ожидаемый результат:

someRandomChanracters_._.

Only

Заранее спасибо за ваши ответы.

Изменить 1: Я думаю, что мой вопрос не был к сути. При преобразовании из шестнадцатеричной в ASCII я сталкиваюсь с этими

a carriage return (0x0d) or a line feed (0x0a)

Вместо перехода на новую строку печатается символ '\ n'. Также, когда я встречаю одинарные кавычки (любые специальные символы), они печатаются в следующем формате:

"'"
"["hello"]" instead of [hello]

Содержимое текстового файла выглядит примерно так:

D8 FF E0 FF 10 00 46 42 11 21 01 00 48 00 27 6E 2E 5F 2E 5F 6F 73 65

И моя цель - преобразовать это шестнадцатеричное содержимое файла в текстовый формат без каких-либо дополнительных кавычек или символов, таких как '\ n' '\ t'

У меня вопрос как это побороть?

1
Rishi Njr 5 Июл 2019 в 07:08

5 ответов

Лучший ответ

Давайте посмотрим, что на самом деле делает ваш код.

Вы берете то, что предположительно является двухсимвольной строкой (скажем, 0a), и декодируете ее в однобайтовый байтовый массив. Затем вы берете строковое представление этого (str(...)), которое в нашем примере будет b'\n'. Почему? Что ж, отдельный байт со значением 10 (0x0a) является символом новой строки в ASCII, поэтому Python показывает его как \n, а b'' показывает, что это байтовый массив. Затем вы убираете b и ': s и печатаете то, что осталось - обратную косую черту и букву n.

Вместо того, чтобы принимать строковое представление байтового массива (который довольно бесполезен ни для чего, кроме отладки), вы должны декодировать его как строку. Нечто подобное (непроверенное) может работать

for i in hexlist:
    print(codecs.decode(i, 'hex').decode('ascii'), end = '')

Однако вы будете декодировать один байт за раз, а это означает, что любое многобайтовое кодирование (такое как UTF-8) не будет работать. Лучшим способом было бы декодировать всю строку сразу (при условии, что строка не будет очень длинной):

print(bytes([int(x, 16) for x in hexlist]).decode('utf-8'))

(обратите внимание, что цикл for был перемещен внутри вызова print с использованием понимания списка).

0
Ture Pålsson 5 Июл 2019 в 05:54

Попробуй это,

with open('file1.txt','r') as f:
    data = f.readlines()
    data_list = [line.replace('\n', '') for line in data]

print(data_list)

< Сильный > Вывод :

['someRandomChanracters_._.', 'Only']

Чтобы напечатать в новой строке,

print(*data_list, sep='\n')
or
# for i in data_list:
#     print(i)
-------------
# Output:
# someRandomChanracters_._.
# Only
1
shaik moeed 5 Июл 2019 в 04:56
fin = open('hexa', 'r') 
hexlist = fin.readline().split(' ')
for i in hexlist:
    print(str(codecs.decode(i, 'hex')).strip("b'").replace('\n', ''), end='\n')
fin.close()
0
sp1rs 5 Июл 2019 в 04:55

Попробуй это:

with open('hexa', 'r') as f:
    for line in f:
        line = line.split(' ')
        print(str(codecs.decode(line, 'hex')).strip("b'"), end='')

Ключевое слово with автоматически закроет файл, даже если что-то пойдет не так.

0
Evan Bloemer 5 Июл 2019 в 04:12

Когда вы получаете такую ошибку, вы можете использовать строковую функцию «split».

string_variable = "someRandomChanracters_._.\n\nOnly"

first_part = string_variable.split("\n\n")[0] #before \n\n
second_part = string_variable.split("\n\n")[1] #after \n\n

Чтобы напечатать его так, как вы хотите:

print(first_part + "\n" + "\n" + second_part)
1
eggrobot78 5 Июл 2019 в 04:44