UnicodeEncodeError: код 'charmap' c не может закодировать символ '\ x9f' в позиции 47: символ отображается на <undefined> - PullRequest
0 голосов
/ 09 марта 2020

Ниже приведен код, который должен конвертировать bz2 в текстовый формат. Однако; Я получаю ошибку Unicode. Так как я использую utf-8, мне интересно, что может быть ошибка

from __future__ import print_function

import logging
import os.path
import six
import sys

from gensim.corpora import WikiCorpus

if __name__ == '__main__':
    program = os.path.basename(sys.argv[0])
    logger = logging.getLogger(program)

    logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
    logging.root.setLevel(level=logging.INFO)
    logger.info("running %s" % ' '.join(sys.argv))

    # check and process input arguments

    inp =  "trwiki-latest-pages-articles.xml.bz2"
    outp = "wiki_text_dump.txt"
    space = " "
    i = 0

    output = open(outp, 'w')
    wiki = WikiCorpus(inp, lemmatize=False, dictionary={})
    for text in wiki.get_texts():
        if six.PY3:
            output.write(' '.join(text).encode().decode('unicode_escape') + '\n')
        #   ###another method###
        #    output.write(
        #            space.join(map(lambda x:x.decode("utf-8"), text)) + '\n')
        else:
            output.write(space.join(text) + "\n")
            #output.write(text)
        i = i + 1
        if (i % 10000 == 0):
            logger.info("Saved " + str(i) + " articles")

    output.close()
    logger.info("Finished Saved " + str(i) + " articles")

Ошибка:

UnicodeEncodeError                        Traceback (most recent call last)
<ipython-input-42-9404745af31b> in <module>()
     32     for text in wiki.get_texts():
     33         if six.PY3:
---> 34             output.write(' '.join(text).encode().decode('unicode_escape') + '\n')
     35         #   ###another method###
     36         #    output.write(

c:\users\m\appdata\local\programs\python\python37\lib\encodings\cp1254.py in encode(self, input, final)
     17 class IncrementalEncoder(codecs.IncrementalEncoder):
     18     def encode(self, input, final=False):
---> 19         return codecs.charmap_encode(input,self.errors,encoding_table)[0]
     20 
     21 class IncrementalDecoder(codecs.IncrementalDecoder):

UnicodeEncodeError: 'charmap' codec can't encode character '\x9f' in position 47: character maps to <undefined>

Я также заменил "unicode_escape" на "utf-8", тогда я получаю эту ошибку

UnicodeEncodeError: 'charmap' codec can't encode characters in position 87-92: character maps to <undefined>

1 Ответ

1 голос
/ 09 марта 2020

Как указывает трассировка, ошибка возникает во время вызова на .encode, , а не во время вызова на .decode. Следовательно, вы не можете решить проблему, изменив код .decode c.

Поскольку код работает в Python 3.x (six.PY3 верно, но почему вас беспокоит вопрос 2. x совместимость в новом коде, написанном сегодня?), и поскольку ' '.join(text) работал, мы заключаем, что text является либо строкой, либо списком строк (не bytes или списком bytes), а ' '.join(text) это строка Действительно, документация говорит нам, что WikiCorpus уже предоставит строки.

Эта строка содержит символ, который ваш код c, cp1254.py (это код Windows) страница, специально предназначенная для текста Turki sh), не может быть закодирована. Мне не ясно, что вы надеетесь сделать sh кодированием, а затем декодированием снова. Просто используйте строку. На самом деле, text уже должна быть единственной строкой, которая не нуждается в .join (если, по какой-то причине, вы не хотите ставить пробел после каждой буквы). Вы должны убедиться в этом сами, выполнив отладку.

...