ValueError: таблица перевода должна быть длиной 256 символов - PullRequest
0 голосов
/ 21 января 2020

У меня есть python flask проект (программа), где я преобразую строку ввода пользователя с заглавными буквами и пунктуацией в строку без них. Когда я запускаю программу, я получаю следующую ошибку:

ValueError: translation table must be 256 characters long

 Traceback (most recent call last) File:

"/home/sd18656/.local/lib/python2.7/site-packages/flask/app.py", line
2463, in __call__ return self.wsgi_app(environ, start_response) File
"/home/sd18656/.local/lib/python2.7/site-packages/flask/app.py", line
2449, in wsgi_app response = self.handle_exception(e) File
"/home/sd18656/.local/lib/python2.7/site-packages/flask/app.py", line
1866, in handle_exception reraise(exc_type, exc_value, tb) File
"/home/sd18656/.local/lib/python2.7/site-packages/flask/app.py", line
2446, in wsgi_app response = self.full_dispatch_request() File
"/home/sd18656/.local/lib/python2.7/site-packages/flask/app.py", line
1951, in full_dispatch_request rv = self.handle_user_exception(e) File
"/home/sd18656/.local/lib/python2.7/site-packages/flask/app.py", line
1820, in handle_user_exception reraise(exc_type, exc_value, tb) File
"/home/sd18656/.local/lib/python2.7/site-packages/flask/app.py", line
1949, in full_dispatch_request rv = self.dispatch_request() File
"/home/sd18656/.local/lib/python2.7/site-packages/flask/app.py", line
1935, in dispatch_request return
self.view_functions[rule.endpoint](**req.view_args) File
"/home/sd18656/FlaskProject/mainapp.py", line 61, in home score,
total_processed_data = get_score(abstract) File
"/home/sd18656/FlaskProject/mainapp.py", line 32, in get_score
abstract = abstract.translate(string.punctuation).lower()

В программе abstract тип строки. Я сталкивался с таким решением: Что означает "таблица" в функции string.translate? для ошибки, однако string.maketrans не похоже на go хорошо с lower() или upper(). Как я могу исправить эту проблему?

Фрагмент кода, который вызывает эту проблему, выглядит следующим образом:

r = reader(open('mycsv.csv','r'))
abstract_list = []
score_list = []
institute_list = []
row_count = 0
for row in list(r)[1:]:
    institute,score,abstract = row[0], row[1], row[2]
    if len(abstract.split()) > 0:
      institute_list.append(institute)
      score = float(score)
      score_list.append(score)
      abstract = abstract.translate(string.punctuation).lower()
      abstract_list.append(abstract)
      row_count = row_count + 1

Содержимое файла mycsv.csv выглядит следующим образом:

enter image description here

1 Ответ

1 голос
/ 21 января 2020

Вам нужно передать таблицу перевода на str.translate (string.translate в Python 2). Таблица перевода - не более чем dict, где key - это символ поиска, а value - замена, где key и value - ord() соответствующих символов.

Если вы хотите заменить все punctuation символы пробелами, например, сделайте что-то вроде этого:

from string import punctuation
transtable = string.maketrans(punctuation, ' ' * len(punctuation))

abstract = abstract.translate(transtable).lower()

Вот подтверждение концепции:

>>> from string import punctuation
>>> transtable = string.maketrans(punctuation, ' ' * len(punctuation))
>>> type(transtable)
<class 'dict'>
>>> 'This!is#a.string,with;punctuations:'.translate(transtable).lower()
'this is a string with punctuations '
>>> 

Вот другой пример использования maketrans и translate (просто для удовольствия):

>>> elite = string.maketrans('aeiou', '4310v')
>>> 'Hackers Rulez'.translate(elite)
'H4ck3rs Rvl3z'
>>> 
...