Как я преобразовываю формат файла от Unicode до ASCII с помощью Python?

Я думаю, что ваш код собирает клиент Dynamodb до завершения вызова sts, так как AWS SDK для JavaScript является асинхронным. Я думаю, что вы можете проверить это, добавив длинную команду сна, чтобы посмотреть, заставит ли это начать работать. Как только вы решите, является ли это проблемой, эта страница из AWS поможет вам изменить ваш код для правильной работы

https://docs.aws.amazon.com/sdk-for-javascript/v2 /developer-guide/calling-services-asynchronously.html

22
задан Ray Vega 6 October 2008 в 17:11
поделиться

6 ответов

Можно преобразовать файл достаточно легко просто использование эти unicode функция, но Вы столкнетесь с проблемами с символами Unicode без прямого эквивалентного ASCII.

Этот блог рекомендует unicodedata модуль, который, кажется, заботится о грубый преобразовании символов без прямых соответствующих значений ASCII, например,

>>> title = u"Klüft skräms inför på fédéral électoral große"

обычно преобразовывается в

Klft skrms infr p fdral lectoral groe

, который является довольно неправильным. Однако с помощью unicodedata модуль, результат может быть намного ближе к оригинальному тексту:

>>> import unicodedata
>>> unicodedata.normalize('NFKD', title).encode('ascii','ignore')
'Kluft skrams infor pa federal electoral groe'
44
ответ дан 29 November 2019 в 03:44
поделиться

я думаю, что это - более глубокая проблема, чем Вы понимаете . Просто изменение файла от Unicode в ASCII легко, однако, заставляя все символы Unicode перевести в разумные дубликаты ASCII (много букв не доступны в обеих кодировках), другой.

Это учебное руководство по Unicode Python может дать Вам лучшее представление о том, что происходит со строками Unicode, которые переводятся в ASCII: http://www.reportlab.com/i18n/python_unicode_tutorial.html

Вот полезная кавычка от сайта:

Python 1.6 также получает "unicode" встроенную функцию, к которой можно определить кодирование:

> >>> unicode('hello') u'hello'
> >>> unicode('hello', 'ascii') u'hello'
> >>> unicode('hello', 'iso-8859-1') u'hello'
> >>>

Все три из них возвращают то же самое, так как символы в 'Привет' характерны для всех трех кодировок.

Теперь позволяют нам закодировать что-то европейским диакритическим знаком, который является за пределами ASCII. То, что Вы видите в консоли, может зависеть от Вашей локали операционной системы; Windows позволяет мне ввести на ISO-Latin-1.

> >>> a = unicode('André','latin-1')
> >>> a u'Andr\202'

, Если Вы не можете ввести острую букву E, можно ввести строку 'Andr\202', который однозначен.

Unicode поддерживает все общие операции, такие как повторение и разделение. Мы не будем работать на основе их здесь.

11
ответ дан 29 November 2019 в 03:44
поделиться

Вот некоторые простые (и глупы) код, чтобы сделать перевод кодирования. Я принимаю (но Вы не были должны), что входной файл находится в UTF-16 (Windows называет это просто 'Unicode').

input_codec = 'UTF-16'
output_codec = 'ASCII'

unicode_file = open('filename')
unicode_data = unicode_file.read().decode(input_codec)
ascii_file = open('new filename', 'w')
ascii_file.write(unicode_data.write(unicode_data.encode(output_codec)))

Примечание, что это не будет работать, если будут какие-либо символы в файле Unicode, которые не являются также символами ASCII. Можно ли сделать следующее для превращения нераспознанных символов в'?:

ascii_file.write(unicode_data.write(unicode_data.encode(output_codec, 'replace')))

Выезд документы для более простого выбора. Если необходимо сделать что-либо более сложное, можно хотеть проверить Молоток UNICODE в Поваренной книге Python.

2
ответ дан 29 November 2019 в 03:44
поделиться

Как это:

uc = open(filename).read().decode('utf8')
ascii = uc.decode('ascii')

Примечание, однако, что это будет сбой с UnicodeDecodeError исключение, если будут какие-либо символы, которые не могут быть преобразованы в ASCII.

РЕДАКТИРОВАНИЕ: Как Pete Karl просто указал, нет никакого непосредственного отображения от Unicode до ASCII. Таким образом, некоторые символы просто не могут быть преобразованы сохраняющим информацию способом. Кроме того, стандартный ASCII является более или менее подмножеством UTF-8, таким образом, Вы не должны действительно даже делать никакого декодирования.

2
ответ дан 29 November 2019 в 03:44
поделиться

Важно отметить, что нет никакого формата файла 'Unicode'. Unicode может быть закодирован к байтам несколькими различными способами. Обычно UTF-8 или UTF-16. Необходимо будет знать, какой сторонний инструмент производит. Как только Вы знаете, что, преобразовывая между различной кодировкой довольно легко:

in_file = open("myfile.txt", "rb")
out_file = open("mynewfile.txt", "wb")

in_byte_string = in_file.read()
unicode_string = bytestring.decode('UTF-16')
out_byte_string = unicode_string.encode('ASCII')

out_file.write(out_byte_string)
out_file.close()

, Как отмечено в других ответах, Вы, вероятно, собираетесь хотеть предоставить обработчик ошибок к закодировать методу. Используя 'замену', поскольку обработчик ошибок прост, но исказит Ваш текст, если это содержит символы, которые не могут быть представлены в ASCII.

0
ответ дан 29 November 2019 в 03:44
поделиться

Как отмечали другие плакаты, ASCII является подмножеством юникода.

Однако, если вы:

  • имеете устаревшее приложение
  • вы не контролируете код этого приложения
  • , вы уверены, что введенные вами данные попадают в подмножество ASCII

Тогда в приведенном ниже примере показано, как для этого:

mystring = u'bar'
type(mystring)
    <type 'unicode'>

myasciistring = (mystring.encode('ASCII'))
type(myasciistring)
    <type 'str'>
0
ответ дан 29 November 2019 в 03:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: