Python 2.7: распечатка декодированной строки - PullRequest
0 голосов
/ 29 мая 2018

У меня есть файл, который называется: Abrázame.txt

Я хочу расшифровать это так, чтобы python понимал, что это за символ 'á', чтобы он выводил мне Abrázame.txt

Это следующий код, который у меня есть в Scratch-файле:

import os

s = os.path.join(r'C:\Test\AutoTest', os.listdir(r'C:\\Test\\AutoTest')[0])
print(unicode(s.decode(encoding='utf-16', errors='strict')))

Ошибка, которую я получаю выше:

Traceback (most recent call last):
  File "C:/Users/naythan_onfri/.PyCharmCE2017.2/config/scratches/scratch_3.py", line 12, in <module>
    print(unicode(s.decode(encoding='utf-16', errors='strict')))
  File "C:\Python27\lib\encodings\utf_16.py", line 16, in decode
    return codecs.utf_16_decode(input, errors, True)
UnicodeDecodeError: 'utf16' codec can't decode byte 0x74 in position 28: truncated data

Я посмотрел набор символов utf-16 ив нем действительно есть характер «а».Так почему же эту строку нельзя декодировать с помощью Utf-16.

Также я знаю, что 'latin-1' будет работать и производить строку, которую я ищу, однако, поскольку это для проекта автоматизации, и я хочучтобы гарантировать, что любое имя файла с любым зарегистрированным символом может быть декодировано и использовано для других целей в проекте, например:

"Открытие проводника по файлу в каталоге файла с уже выбранным файлом."

Проходит ли цикл по каждому из кодеков (заметьте, я верю, что существует 93 кодека), чтобы найти, какой из них можно декодировать, наилучший способ получения результата, который я ищу?Я полагаю, что есть нечто гораздо лучшее, чем это решение.

1 Ответ

0 голосов
/ 29 мая 2018

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

os.listdir(r'C:\\Test\\AutoTest')[0]

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

import sys
fs_encoding = sys.getfilesystemencoding()
s = os.path.join(r'C:\Test\AutoTest',
    os.listdir(r'C:\\Test\\AutoTest')[0].decode(encoding=fs_encodig, errors='strict')
print(s)

Обратите внимание, что после декодирования у вас есть строка в Unicode, и вам не нужно создавать из нее новый объект unicode().

latin-1 работает, если этоваша текущая кодовая страница.Интересен тот факт, что, несмотря на то, что в течение многих лет Windows поддерживает «широкие» символы с «W» версиями их API, python 2 является однобайтовой и не использует их.

Долгоживущий Python3.

...