@voiceofnoise

Почему при вынесении из цикла переменной, которая не изменяется вываливается ошибка?

python 2.7
Почему так работает:
import urllib, json

url_members = 'https://api.vk.com/method/groups.getMembers?group_id=67824212'
for j in range(3):
    response_url_members = urllib.urlopen(url_members)
    members = json.loads(response_url_members.read())['response']['users'][j]
    print(members)

А если вынести переменную response_url_members из цикла ошибка:
import urllib, json

url_members = 'https://api.vk.com/method/groups.getMembers?group_id=67824212'
response_url_members = urllib.urlopen(url_members)
for j in range(3):
    members = json.loads(response_url_members.read())['response']['users'][j]
    print(members)

Traceback (most recent call last):
  File "/home/eq/PycharmProjects/vk_stat_users/main.py", line 30, in <module>
    members = json.loads(response_url_members.read())['response']['users'][j]
  File "/usr/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

Первый вариант не подходит - медленный. Что можно сделать?
upd: print в обоих вариантах добавил в цикл
  • Вопрос задан
  • 516 просмотров
Решения вопроса 2
import urllib, json

url_members = 'https://api.vk.com/method/groups.getMembers?group_id=67824212'
response_url_members = urllib.urlopen(url_members)
data = json.loads(response_url_members.read())
members = data['response']['users']
print(members)

в первом варианте у вас три раза запрашивается урл
во втором урл запрашивается один раз, первый вызов read забирает все данные, и на втором уже убудет пустая строка, которая не является валидным json, отсюда ошибка.
При этом у вас на каждой итерации цикла вызывается преобразование одних и техже данных в json.
помимо этого сам цикл вообще бесполезный поскольку в переменную members, будет на каждой итерации записываться значение и затираться следующим, будет проще обратится по индексу сразу. members = data['response']['users'][2]
Ответ написан
djdeniro
@djdeniro
DeNet
потому что в 1 случае ты загружаешь три раза одно и тоже
во втором случае ты пытаешься считать одно и тоже (но так нельзя, это как с файлами, открыл файл, дошел до конца, открывай снова(или записывай че открыл)

Короче, юзай 1 способ или вместо urllib urllib2,

------
Ну и банально ты можешь просто выходить за границы массива

-----
Еще вариант, в первую очередь его попробуй:
вынеси response_url_members.read() в отдельную переменную и в цикле юзай его
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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