@wulfdog

Вот index out of range при переводе слова из файла?

import warnings
import locale
import json
import requests
warnings.filterwarnings("ignore")
locale.setlocale(locale.LC_ALL, '')

def ya_dict (word_tr):
    yandexkey = "dict.1.1.xxxxx"
    lang = "en-ru"
    text = word_tr
    uri = f"https://dictionary.yandex.net/api/v1/dicservice.json/lookup?key={yandexkey}&lang={lang}&text={text}"
    outelem = len(json.loads(requests.post(uri).text))
    r = requests.post(uri)
    for x in range(0, outelem):
        print (eval(r.text)["def"][0]["tr"][x]["text"])

f = open('1word.txt', 'r')
print (ya_dict (f))

Есть у меня вот такой чудо код. Признаюсь, я не до конца... да что там, почти не понимаю как он работает в деталях.
Естть стандартный кусок перевода слова через яндекс, если пишу слово в переменную вручную - то ОК. Но я хочу прочитать слово из файла и получаю:

Traceback (most recent call last):
  File "D:\translate\translate yandex 3.py", line 21, in <module>
    print (ya_dict (f))
  File "D:\translate\translate yandex 3.py", line 18, in ya_dict
    print (eval(r.text)["def"][0]["tr"][x]["text"])
IndexError: list index out of range


Хочу допилить скрипт который создает словарь для конкретной статьи или книги. А тяму еще не хватает, а скрипт хочу уже сейчас, чтобы английский пилить.
На данный момент пытаюсь читать хоть одно слово из файла где одно слово. До этого игрался со splitline и т.д. (уже есть файл где построчно составлен словарь без перевода)
Помогите товарищи, помидорами кидайте но помогите =)
PS если еще чуть разъясните что тут происходит особенно тут: print (eval(r.text)["def"][0]["tr"][x]["text"]) пытался в вывод добавить еще и транскрипцию но нешмог =(
  • Вопрос задан
  • 235 просмотров
Решения вопроса 1
@ElefanObi
Чтобы прочитать слово из файла, надо применить readlines(). Print() не нужен, потому что функция не возвращает ответ, а печатает его сама.
with open('1word.txt', 'r') as f:
    for line in f.readlines():
        ya_dict (line.strip())

strip() нужен чтобы удалить знаки переноса строки.
text = word_tr бессмысленная строка. Или сразу называйте переменную text или передавайте в ссылку word_tr.
eval() не нужен. Он выполняет код, переданный ему в виде строки. Например:
eval('print("text")')
напечатает text, как будто 'print("text")' не строковая переменная, а команда.
После строки содержащей uri = лучше написать так:
r = requests.post(uri)  # делаем запрос к яндексу
data = json.loads(r.text)  # конвертируем строку json в словарь
word_list = data["def"][0]["tr"]  # получаем список
for word in word_list:
    print(word["text"])

Цикл forперебирает все элементы списка и получает из каждого полученного словаря значение с ключем 'text'.
Саму строку с uriлучше написать так:
uri = 'https://dictionary.yandex.net/api/v1/dicservice.json/lookup?key={}&lang={}&text={}'.format(yandexkey, lang, text)

Тогда не получите ошибку Invalid syntax.
Увидеть какой должен прийти результат можно здесь.
Код я не тестировал, потому что у меня нет api ключа, но надеюсь сейчас уже проще будет разобраться что происходит.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы