Невозможно прочитать файл как обычный текст - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть сценарий powershell, который я пытаюсь прочитать и проанализировать его.Я могу читать только в байтах, а не в виде простого текста.

f=open('~/Data/3 - Get-Services - Jobs Version 1.0.ps1','r')
txt=f.read()

Когда я пробую приведенный выше код, я выдаю ошибку.

UnicodeDecodeError: кодек «utf-8» не может декодировать байт 0xff в позиции 0: недопустимый стартбайт

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

f=open('~/Data/3 - Get-Services - Jobs Version 1.0.ps1','rb')
txt=f.read()
txt.decode('utf-8')

UnicodeDecodeError: 'Кодек utf-8 'не может декодировать байт 0xff в позиции 0: недопустимый начальный байт

Я посмотрел данные в командной строке и заметил, что все файлы начинаются с "��".Я чувствую, что этот персонаж вызывает проблему, но я не знаю, как решить эту проблему.

Не могли бы вы помочь

Ответы [ 2 ]

4 голосов
/ 12 апреля 2019

Редактировать: несмотря на четыре возражения, мое предположение было неправильно .В кодировке UTF-8 спецификация будет выглядеть как 0xEF,0xBB,0xBF, поэтому первый байт будет 0xEF, а не 0xFF.

0xFF,0xFE будет означать начало UTF-16 с прямым порядком байтовфайл.Для этого используйте кодировку utf-16


Я предполагаю, что два "неизвестных" символа в начале - это Unicode BOM (метка порядка байтов) .

В этом случае расшифруйте с помощью utf-8-sig вместо utf-8.Нет необходимости сначала читать как байты;Вы можете передать encoding в функцию open() напрямую:

f = open('~/Data/3 - Get-Services - Jobs Version 1.0.ps1', 'r', encoding='utf-8-sig')
2 голосов
/ 12 апреля 2019

Я цитирую ответ Питера Огдена от ошибка UnicodeDecodeError: кодек «utf-8» не может декодировать байт 0xff в позиции 0: недопустимый начальный байт (не принятый ответ).

Я сталкивался с этой темой, когда сталкивался с той же ошибкой, после некоторого исследования, которое я могу подтвердить, эта ошибка возникает, когда вы пытаетесь декодировать файл UTF-16 с помощью UTF-8.

В UTF-16 первый символ (2 байта в UTF-16) представляет собой метку порядка байтов (BOM), которая используется в качестве подсказки декодирования и не отображается как символ в декодированной строке.Это означает, что первый байт будет либо FE, либо FF, а второй - другим.

Сильно отредактировано после того, как я узнал реальный ответ

Итак, изменение на UTF-16 должноисправить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...