Поиск по блогу

четверг, 16 января 2014 г.

Ошибка nbconvert при конвертации файла .ipynb в .html

Эта ошибка появляется уже второй раз. Первый раз я просто поменял формат в некоторых ячейках с "Markdown" "Raw text", в других ячейках обнаружились "неправильные html теги",
например:
In [2]:
# </br> вместо <br/>
Очевидно, что nbconvert формирует теги вокруг ячеек того или иного вида..., но как могут возникнуть проблемы с чтением непонятных символов? Вот сообщение из консоли:
In []:
C:\Users\kiss\Documents\IPython Notebooks\web\Temp_1>ipython nbconvert  с2_28_1.ipynb
Traceback (most recent call last):
  File "C:\Users\kiss\Anaconda\Scripts\ipython-script.py", line 5, in <module>
    sys.exit(start_ipython())
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\__init__.py", line 118, in start_ipython
    return launch_new_instance(argv=argv, **kwargs)
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\config\application.py", line 544, in launch_instance
    app.initialize(argv)
  File "<string>", line 2, in initialize
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\config\application.py", line 89, in catch_config_error
    return method(app, *args, **kwargs)
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\terminal\ipapp.py", line 312, in initialize
    super(TerminalIPythonApp, self).initialize(argv)
  File "<string>", line 2, in initialize
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\config\application.py", line 89, in catch_config_error
    return method(app, *args, **kwargs)
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\core\application.py", line 362, in initialize
    self.parse_command_line(argv)
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\terminal\ipapp.py", line 307, in parse_command_line
    return super(TerminalIPythonApp, self).parse_command_line(argv)
  File "<string>", line 2, in parse_command_line
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\config\application.py", line 89, in catch_config_error
    return method(app, *args, **kwargs)
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\config\application.py", line 463, in parse_command_line
    self.argv = list(argv)
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\utils\traitlets.py", line 315, in __set__
    new_value = self._validate(obj, value)
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\utils\traitlets.py", line 323, in _validate
    return self.validate(obj, value)
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\utils\traitlets.py", line 1215, in validate
    value = self.validate_elements(obj, value)
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\utils\traitlets.py", line 1291, in validate_elements
    return super(List, self).validate_elements(obj, value)
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\utils\traitlets.py", line 1225, in validate_elements
    v = self._trait.validate(obj, v)
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\utils\traitlets.py", line 1028, in validate
    return unicode(value)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf1 in position 0: ordinal not in range(128)

C:\Users\kiss\Documents\IPython Notebooks\web\Temp_1>
Поскольку накануне я экспериментировал с вызовами команд консоли из Notebook (!dir - распечатала директорию, но с крякозябами вместо кириллицы). Я поэкспериментировал с !chcp chcp, менял кодировки... Вот рекомендации по настройке кодировок консоли.
Не "повредил" ли я этим работу консоли?
Но первым делом я решил проверить, как работает мой конвертер и конвертировал этот файл... точнее, все ячейки выше этой строчки, все прошло нормально, вот сообщения из консоли:
In []:
C:\Users\kiss\Documents\IPython Notebooks\web\Temp_1>ipython nbconvert  c2_nbconvert_err1.ipynb
[NbConvertApp] Using existing profile dir: u'C:\\Users\\kiss\\.ipython\\profile_default'
[NbConvertApp] Converting notebook c2_nbconvert_err1.ipynb to html
[NbConvertApp] Support files will be in c2_nbconvert_err1_files\
[NbConvertApp] Loaded template html_full.tpl
[NbConvertApp] Writing 209190 bytes to c2_nbconvert_err1.html
Поиск в интернет дал вот этот материал codec can't decode byte 0xf1 in position 0: ordinal not in range(128)
In [3]:
#Теперь выполняем упражнение из ссылки выше
s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
s1 = s.decode('utf-8')
print s1
(。・ω・。)ノ

У меня на компьютере с кодеками все нормально... В чем же причина ошибки? The UnicodeDecodeError normally happens when decoding an str string from a certain coding.
In [4]:
"a".decode("utf-8")
Out[4]:
u'a'
In [6]:
"\xf1".decode("utf-8")
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-6-1c1cd100b838> in <module>()
----> 1 "\xf1".decode("utf-8")

C:\Users\kiss\Anaconda\lib\encodings\utf_8.pyc in decode(input, errors)
     14 
     15 def decode(input, errors='strict'):
---> 16     return codecs.utf_8_decode(input, errors, True)
     17 
     18 class IncrementalEncoder(codecs.IncrementalEncoder):

UnicodeDecodeError: 'utf8' codec can't decode byte 0xf1 in position 0: unexpected end of data
In [9]:
"a\xf1".decode("utf-8", "replace")
Out[9]:
u'a\ufffd'
In [7]:
"\u04412_28_1".decode("utf-8")
Out[7]:
u'\\u04412_28_1'
...encode converts a unicode object to a string object
In [10]:
u"你好".encode("utf8")
Out[10]:
'\xe4\xbd\xa0\xe5\xa5\xbd'
In [11]:
print _
你好

In [12]:
'\xe4\xbd\xa0\xe5\xa5\xbd'.decode("utf-8")
Out[12]:
u'\u4f60\u597d'
In [13]:
print _
你好

Кажется ответ найден. Вот подсказка: How can I display native accents to languages in console in windows? First of all, in Python 2.x you can't encode a str that has non-ASCII characters. You have to write
In [15]:
u"Español\nPortuguês\nItaliano".encode('utf-8')
Out[15]:
'Espa\xc3\xb1ol\nPortugu\xc3\xaas\nItaliano'
In [16]:
print _
Español
Português
Italiano

Using UTF-8 at the Windows console is difficult.
You have to set the Command Prompt font to a Unicode font (of which the only one available by default is Lucida Console), or else you get IBM437 encoding anyway.
chcp 65001
Modify encodings._aliases to treat "cp65001" as an alias of UTF-8.
And even then, it doesn't seem to work right.

Попробуем резюмировать

При работе надо текстом (файлом) я несколько раз переключал кодировку консоли (чтобы убрать крякозябы). Если открыть файл c2_28_1.ipynb, то можно увидеть там строчки вида "source": "41243e43743c43e......" Это кодировка utf-8 Как 'ascii' codec брал из браузера строку кириллицы и переводил ее из кодировски cp 866 в utf-8 ? А потом я заставил его другие строки переводить из cp65001 в utf-8...
Казалось бы, ну и что? utf-8 и в Африке utf-8... Только вот... не так все просото... Если я переключаю кодироку в браузере, то страница ноутбук воспроизводится у меня без ошибок (?!?). Т.е., сервер http://127.0.0.1:8888/1f1cca2a-2f7b-4f96-9bc9-b9877ff1def7# берет страницу (из кэша?) и отдает браузеру в требуемой кодировке.
Ну и что? Все должно работать... Да, пожалуй я эту задачку не решу без понимания utf в Python... Начал читать и конспектировать соответствующий раздел у Лутца... А этот пост заканчиваем, поскольку решение найдено (случайно)

Решение проблемы: В ИМЕНИ ФАЙЛА ЗАМЕНИТЬ "c2_28_1.ipynb" первую букву "с" на латинсткую (была кириллица). В самом файле должна быть запись:

In []:
...
"metadata": {
  "name": "c2_28_1" # Здесь вместо латиницы "c" стояли символы utf-8 для кириллицы - буквы эс
  ...

Комментариев нет:

Отправить комментарий