Итерация URL с использованием данных в CSV для извлечения данных API - Python - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть около 20 000 почтовых индексов в файле CSV в одном столбце.Я пытаюсь извлечь некоторые географические данные о выборах на основе этих почтовых индексов через API.URL для этого API повторяется в конце (где почтовые коды меняются для каждой итерации).Я пробовал несколько разных примеров кода, но ни один из них не работает.

РЕДАКТИРОВАТЬ: Вставка семпла ниже, который я теперь знаю, не работает - в первую очередь потому, что мне не нужна функция стриптиза.Тем не менее, как я могу получить цикл для извлечения почтовых индексов из файла CSV напрямую?Также вставляю сообщения об ошибках, которые я получаю.


    responses = list()

    with open("testpostal.csv") as f:
        for postal in map(str.strip,f):     
            rrr = requests.get('https://represent.opennorth.ca/postcodes/{}'.format(postal))
            data = json.loads(rrr.text)
            responses.append(data)

    print(responses)


JSONDecodeError                           Traceback (most recent call last)
<ipython-input-182-05e370407e9c> in <module>()
      9     for postal in map(str.strip,f):
     10         rrr = requests.get('https://represent.opennorth.ca/postcodes/{}'.format(postal))
---> 11         data = json.loads(rrr.text)
     12         responses.append(data)
     13 

~/anaconda3/lib/python3.7/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    346             parse_int is None and parse_float is None and
    347             parse_constant is None and object_pairs_hook is None and not kw):
--> 348         return _default_decoder.decode(s)
    349     if cls is None:
    350         cls = JSONDecoder

~/anaconda3/lib/python3.7/json/decoder.py in decode(self, s, _w)
    335 
    336         """
--> 337         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    338         end = _w(s, end).end()
    339         if end != len(s):

~/anaconda3/lib/python3.7/json/decoder.py in raw_decode(self, s, idx)
    353             obj, end = self.scan_once(s, idx)
    354         except StopIteration as err:
--> 355             raise JSONDecodeError("Expecting value", s, err.value) from None
    356         return obj, end

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Включите ошибки, которые вы получите, которые укажут вам правильное направление.Хотя для начала,

map(str.strip, f) 

, вероятно, ничего не значит.

При использовании функции стриптиз вы должны включать то, что вы хотите «стриптизировать», и строку, из которой вы удаляете.Например, из этот учебник:

str = "0000000this is string example....wow!!!0000000";
print str.strip( '0' )

возвращает:

this is string example....wow!!!
0 голосов
/ 01 декабря 2018

Хорошо, я понял, что я делаю не так.Я только что получил python для чтения моего столбца csv в виде списка, а затем использовал цикл for, чтобы получить результаты в формате json.Вставьте приведенный ниже код, если он кому-нибудь пригодится:

import csv

with open('PC2.csv','r') as f:
    lines = f.read()
    list = lines.split('\n')

postcodes = list #not really necessary but I wanted to preserve specific names
response = []

for postcode in postcodes:
    rr = requests.get('https://represent.opennorth.ca/postcodes/{}'.format(postcode))
    data = json.loads(rr.text)
    response.append(data)



print(response)
0 голосов
/ 01 декабря 2018

Python предоставляет модуль CSV , с помощью которого вы можете выполнять следующие действия:

import csv,requests
URL = 'https://represent.opennorth.ca/postcodes/%s'
responses = []
with open("testpostal.csv") as csv_file:
   csv_reader = csv.reader(csv_file)
   for row in csv_reader:
       responses.append(requests.get(URL % row[0]).json())

Это позволит пропустить раздражение при разборе файла CSV.Приведенный выше код работает для меня, если я использую канадские почтовые индексы без пробелов.

...