Python TypeEror: ожидал объект буфера строки или другого символа - PullRequest
0 голосов
/ 29 января 2019

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

import string
def readFile():

translate_table = dict((ord(char), None) for char in string.punctuation)
with open('out_file.txt', 'w') as out_file:
    with open('moviereview.txt') as file:
        for line in file:
            line = ' '.join(line.split(' '))
            line = line.translate(translate_table)
            out_file.write("<s>" + line.rstrip('\n') + "</s>" + '\n')

return out_file

Однако я получаю сообщение об ошибке:

TypeError: ожидается объект буфера строки или другого символа

Я думаю, что послеЯ разделяю и присоединяюсь к строке, получаю список строк, поэтому не могу использовать str.translate () для его обработки.Но похоже, что у всех есть то же самое, и это работает, напр.https://appliedmachinelearning.blog/2017/04/30/language-identification-from-texts-using-bi-gram-model-pythonnltk/ в примере кода из строки 13.

Так что я действительно растерялся, кто-нибудь может помочь?Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 января 2019

В Python 2 только типы unicode имеют метод translate, который принимает dict.Если вы собираетесь работать с произвольным текстом, самое простое решение здесь - просто использовать версию Python 3 open на Py2;он будет беспрепятственно декодировать ваши входные данные и выдавать unicode вместо str.

Начиная с Python 2.6+, заменить обычную встроенную open на версию Python 3 просто.Просто добавьте:

from io import open

к импорту в верхней части вашего файла.Вы также можете удалить line = ' '.join(line.split(' '));это определенно неоперативный (он разделяется на один пробел, чтобы создать list, а затем воссоединяется на один пробел).Вы также можете добавить:

from __future__ import unicode_literals

к очень верху вашего файла (до всех вашего кода);это автоматически сделает все ваши обычные кавычки unicode литералами, а не str литералами (префикс реальных двоичных данных с b, чтобы сделать его литералом str на Py2, bytes литерал на Py3).

Приведенное выше решение лучше всего, если вы можете использовать его, потому что оно заставит ваш код работать правильно как на Python 2, так и на Python 3. Если вы не можете сделать это по какой-либо причине, то вам нужно изменить свой translate вызов для использования API Python 2 * ожидает 1033 *, что означает полное удаление определения translate_table (в этом нет необходимости) и просто выполнение:

line = line.translate(None, string.punctuation)

для Python2 str.translate, аргументы представляют собой таблицу сопоставления один к одному для всех значений от 0 до 255 включительно в качестве первого аргумента (None, если сопоставление не требуется), а второй аргумент представляет собой строку символов для удаления (который string.punctuation уже предоставляет).

0 голосов
/ 29 января 2019

Ответ здесь, потому что комментарий не позволяет мне правильно отформатировать код:

def r():
    translate_table = dict((ord(char), None) for char in string.punctuation)
    a = []
    with open('out.txt', 'w') as of:
        with open('test.txt' ,'r') as f:
            for l in f:
                l = l.translate(translate_table)
                a.append(l)
                of.write(l)
    return a

Этот код работает нормально для меня без ошибок.Можете ли вы попробовать запустить это и ответить скриншотом кода, который вы запустили?

...