WedX - журнал о программировании и компьютерных науках

Как преобразовать строки двоичного типа, полученные в режиме rb, в обычные в Python?

У меня есть список со строками двоичного типа, который выглядит следующим образом, который получается при чтении текстового файла в режиме rb (поскольку r не работает для чтения файла из-за вероятного перепутывания символов из разных кодировок): -

new_list = [b'Vanessa Skarski\'s Account of Her Father\'s Death....', b'Hornslet wind-turbine collapse\r\nFrom Wikipedia' .....] и т. д.

Всего в списке 271 элементов. Но я хочу, чтобы элементы списка были обычными строками, а не двоичными. Я изучил использование new_list = [item.decode(encoding='utf-8') for item in new_list]

но это дает UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 643: invalid start byte. Я просто хочу избавиться от b и получить нормальные строки. Любые идеи, пожалуйста?

EDIT Решение, упомянутое в разделе Преобразовать байты в строку? не решил проблему, как я уже упоминал в своем первоначальном сообщении. Моя версия Python указана ниже, если она вообще имеет какое-либо отношение к ошибке.

3.5.2 (v3.5.2:4def2a2901a5, Jun 26 2016, 10:47:25) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]

  • Возможный дубликат Преобразовать байты в строку? 19.07.2019
  • @ norok2, как я уже упоминал, я пробовал различные решения, используя декодирование utf-8 (синтаксис уже сформулирован в моем вопросе), но ничего не сработало. Так что я думаю, что это не дубликат. Я отредактировал вопрос, чтобы упомянуть об этом. Спасибо 19.07.2019
  • Если вы внимательно изучите принятый ответ, он говорит: utf-8 is used here because it is a very common encoding, but you need to use the encoding your data is actually in. Подход правильный, кодировка - нет. Посмотрите тот, который, как вы могли подумать, это. 19.07.2019
  • @ norok2 Я читаю свой текстовый файл в двоичном режиме (rb). Так вы можете сказать, какая кодировка будет для этого? Спасибо 19.07.2019
  • Вся идея двоичного файла заключается в том, что он не имеет кодировку — это необработанные байты. Вам нужно знать кодировку, чтобы преобразовать ее в строку. Мы могли бы попытаться разобраться с этим для вас, но вы указали важные детали. Что находится на (и вокруг) позиции 643? 19.07.2019

Ответы:


1

Объект байтов, который у вас есть, не закодирован в UTF-8. Кодировка зависит от фактической информации ваших файлов, и никто не может сказать вам, как правильно их кодировать, кроме того, кто создал файлы в первую очередь и знает, какая кодировка использовалась.

Тем не менее, популярные варианты, учитывая контекст, могут быть:

  • latin1 (всегда будет расшифровываться, но может не иметь для вас смысла)
  • cp1252 популярный выбор для систем Windows

отсюда, например:

new_list = [item.decode(encoding='latin1') for item in new_list]
19.07.2019
  • Как я уже сказал, latin1 будет работать ВСЕГДА (т. е. никогда не выдаст ошибку), но может не дать вам значимого результата, например. '24 °C'.encode('utf8').decode('latin1') даст вам: '24 °C'. Поэтому обязательно проверьте свои результаты. 19.07.2019
  • Когда я столкнулся с ситуацией, когда я не был уверен в кодировке, я использовал подход, когда я просто перебрал список всех кодировок и применил каждую из них внутри блока try-catch. Потом я посмотрел, какие из них работают лучше всего. Не уверен, что это считается хорошим подходом, но у меня сработало. 19.07.2019
  • @ConstantineKetskalo, учитывая, что некоторые из них ВСЕГДА будут работать, вам нужно найти более эффективные подходы к проверке, чем обнаружение ошибки. 19.07.2019
  • @norok2 наверное да. Но однажды я использовал его, просто вручную выбрав то, что сработало, когда мне нужно было просто обработать один или два файла. В другой раз, когда мне нужно было использовать их много, я просто написал код, который делает то же самое, но выбирает первую кодировку, что приводит к тексту, содержащему определенную строку, которая мне нужна. Возможно, у кого-то может быть даже лучшее представление об этом. Я был бы рад это услышать. ) 19.07.2019

  • 2

    Просто используйте 'utf8' вместо 'utf-8'. У меня работало с использованием Python 3.7 в Windows 10.

    new_list = [b'Vanessa Skarski\'s Account of Her Father\'s Death....', b'Hornslet wind-turbine collapse\r\nFrom Wikipedia']
    
    for item in new_list:
        decoded_item = item.decode('utf8')
        print(item)
        print(type(item))
        print(decoded_item)
        print(type(decoded_item))
        print()
    

    выход:

    b"Vanessa Skarski's Account of Her Father's Death...."
    <class 'bytes'>
    Vanessa Skarski's Account of Her Father's Death....
    <class 'str'>
    
    b'Hornslet wind-turbine collapse\r\nFrom Wikipedia'
    <class 'bytes'>
    Hornslet wind-turbine collapse
    From Wikipedia
    <class 'str'>
    
    19.07.2019
  • Я получаю ту же ошибку UnicodeDecodeError: кодек utf-8 не может декодировать байт 0x93 в позиции 643: недопустимый начальный байт даже при использовании utf8 вместо utf 19.07.2019
  • «utf-8» и «utf8» относятся к одной и той же кодировке в Python — см. список здесь 19.07.2019
  • О, тогда ладно. Спасибо, змеечармерб. Я думаю, что у меня была ситуация, когда «utf-8» был неправильным, а «utf8» был правильным. Но я могу что-то спутать, потому что это было прилично давно. 19.07.2019
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]