Работа с символами Юникода - PullRequest
0 голосов
/ 26 июня 2018

Я знаю, что этот вопрос задавали бесчисленное количество раз раньше, но я не могу заставить работать какое-либо из решений. Я пытался использовать модуль codecs, модуль io. Кажется, ничего не работает.

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

AHIMSA Centro de Sanación Pránica, Pranic Healing

Кроме того, я не уверен, где и когда могут появиться символы Unicode, что добавляет дополнительный уровень сложности, поэтому мне нужно всеобъемлющее решение, и я не совсем уверен, как поступить с потенциальными не-ASCII символами .

Я не уверен, что у меня будет Python 3.6.5 в производственной среде, поэтому решение должно работать с 2.7.

Что я могу сделать здесь? Как я могу справиться с этим?

# -*- coding: utf-8 -*-
...
with open('test.txt', 'w') as f:
f.write(str(len(discoverable_cards)) + '\n\n')
    for cnt in range(0, len(discoverable_cards)):
        t = get_time()
        f.write('[ {} ] {}\n'.format(t, discoverable_cards[cnt]))
        f.write('[ {} ] {}\n'.format(t, cnt + 1))
        f.write('[ {} ] {}\n'.format(t, product_type[cnt].text))
        f.write('[ {} ] {}\n'.format(t, titles[cnt].text))
...

Любая помощь будет оценена!

1 Ответ

0 голосов
/ 26 июня 2018

Учитывая, что вы находитесь в python2.7, вы, вероятно, захотите явно кодировать все свои строки с помощью набора символов, совместимого с юникодом, такого как "utf8", прежде чем передавать их в write, вы можете сделать это с помощью простого метода кодирования:

def safe_encode(str_or_unicode):
    # future py3 compatibility: define unicode, if needed:
    try:
       unicode
    except NameError:
       unicode = str
    if isinstance(str_or_unicode, unicode):
        return str_or_unicode.encode("utf8")
    return str_or_unicode

Вы бы тогда использовали это так:

f.write('[ {} ] {}\n'.format(safe_encode(t), safe_encode(discoverable_cards[cnt])))
...