Задать вопрос
@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 Простой 9 комментариев
Решения вопроса 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 ключа, но надеюсь сейчас уже проще будет разобраться что происходит.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы