UnicodeEncodeError в IPython, но не стандартный REPL - PullRequest
1 голос
/ 21 марта 2019

Я читаю в файле, который содержит символы Юникода, используя Python 3.6.3. В стандартном Python REPL я могу без проблем прочитать файл, указав кодировку UTF-8:

>>> with open("emoji.csv", encoding='utf-8') as f:
...     lines = f.readlines()
>>> lines
['this line has an emoji \U0001f644\n']

Никаких проблем там нет. Однако, когда я пытаюсь сделать то же самое в IPython 6.1.0, я получаю следующее UnicodeEncodeError:

In [1]: with open('emoji.csv', encoding='utf-8') as f:
...:     lines = f.readlines()
...:

In [2]: lines
Out[2]: ---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)
<ipython-input-2-3fb162a4fe05> in <module>()
----> 1 lines

/opt/anaconda/lib/python3.6/site-packages/IPython/core/displayhook.py in __call__(self, result)
    259             self.fill_exec_result(result)
    260             if format_dict:
--> 261                 self.write_format_data(format_dict, md_dict)
    262                 self.log_output(format_dict)
    263             self.finish_displayhook()

/opt/anaconda/lib/python3.6/site-packages/IPython/core/displayhook.py in write_format_data(self, format_dict, md_dict)
    188                 result_repr = '\n' + result_repr
    189 
--> 190         print(result_repr)
    191 
    192     def update_user_ns(self, result):

UnicodeEncodeError: 'ascii' codec can't encode character '\U0001f644' in position 24: ordinal not in range(128)

Аналогично, если я пытаюсь просто кодировать и декодировать символ Unicode сам по себе, я получаю ту же ошибку:

In [1]: '\U0001f644'.encode('utf-8').decode('utf-8')
Out[1]: ---------------------------------------------------------------------------
...
...
UnicodeEncodeError: 'ascii' codec can't encode character '\U0001f644' in position 1: ordinal not in range(128)

Что вызывает это, и как я могу прочитать этот файл в IPython?

Редактировать : Похоже, что это функция IPython, использующая кодировку ASCII по умолчанию:

In [1]: from IPython.utils.encoding import get_stream_enc; import sys

In [2]: get_stream_enc(sys.stdout)
Out[2]: 'ANSI_X3.4-1968'

Однако я не вижу в документации IPython ничего о том, как это изменить. Это возможно?

1 Ответ

0 голосов
/ 22 марта 2019

Это связано с тем, что моя система использует локаль POSIX.Настройка $PYTHONIOENCODING=UTF-8 решила проблему, переопределив кодировку на основе ASCII, которую IPython использовал по умолчанию.

...