Ошибка типа: не может соединять str с байтами.Список в текстовый файл - PullRequest
0 голосов
/ 04 апреля 2019

Я получаю TypeError: can't concat str to bytes, когда пытаюсь записать список слов в текстовый файл.

Ниже находится то, что написано в книге, и она вернула TypeError, тогда я попытался по-другому, и это сработало.

# Error Code
f = open('words.txt', 'w')
for word in stemmed:
    try:
        f.write(word.encode('utf-8') + '\n')
    except UnicodeEncodeError, e:
        print 'Enconding error ' + word + '\n'
f.close()

# Working Code
f= open('word.txt','w',encoding= 'utf-8')
for word in stemmed:
    try:
        f.write(word+'\n')
    except UnicodeEncodeError as e:
        print('Encoding Error' + word + '\n')
f.close()

В чем разница между двумя кодами?Похоже, # Working Code сохраняет список слов в txt файл, но не печатает никаких ошибок кодирования?

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Кажется, что первый фрагмент (из книги) написан для Python 2. В Python 2 строки байтов (тип str) и строки Unicode (тип unicode) могут быть смешаны - иногда это работаетиногда он вызывает UnicodeError, а иногда выдает мусорный текст ("mojibake").

Однако вы, очевидно, работаете с Python 3 (что хорошо!), где два типа строк несовместимы: вы можетеНе смешивайте байтовые строки (тип bytes) и строки Unicode (тип str).

Фрагмент "рабочий код" выглядит хорошо для меня, нет необходимости что-либо менять (хотя использование withЗаявление об открытии файла было бы неплохо).Он не создает никаких UnicodeError, потому что в очень редких случаях происходит сбой кодирования в UTF-8.Если бы произошла ошибка, она была бы обработана вашим предложением except.

Вероятно, нет необходимости полностью понимать, почему первый фрагмент не работает.Просто отбросьте «код ошибки» и попробуйте найти более свежую книгу, посвященную Python 3. Python 2 скоро будет прекращен, вам не придется беспокоиться об этом, если вы новичок в Python.

0 голосов
/ 04 апреля 2019

код ошибки, результат кода word.encode() представляет собой байтовый объект, поэтому вы не можете объединять str и байты. рабочий код: слово и '\ n' были закодированы до того, как были помещены в текстовый файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...