Python чтение CSV чтение строки за строкой и цикла цикла - PullRequest
0 голосов
/ 31 мая 2018

Я хочу автоматизировать задачу в Python с помощью Google API Search Place.Прямо сейчас мой код с Google Maps API возвращает места «больница» для одного набора географических координат.

Но у меня есть CSV-файл, который содержит много географических координат.

1: Hanoi,10.762622,106.660172  
2: Ho Chi Minh,12.762622,108.660175  
3: Ho Chi Minh,11.8542,108.660175 
4: ...
5: ...

Как вы можете видеть из моего кода, это неэффективно, потому что мне нужно изменить географические координаты вручную.

Для каждой строки (географических координат) в моем CSV-файле я хочу, чтобы мой код читал географические координаты 1: Ханой и давал мне результаты «больницы» для этих географических координат.После прочтения строки 2: Хо Ши Мин и то же самое для всех остальных строк.

Как я могу добиться этого или каких-либо хороших примеров того, как сделать такие задачи более эффективными?

import urllib
import urllib.request
import json

googleGeocodeUrl = 'https://maps.googleapis.com/maps/api/place/textsearch/json?query='
keyword = "hospital"
geolocation = "&location=-12.135,-77.023&radius=5000"
APIKEY = '&key='+'apikey'

url = googleGeocodeUrl + keyword + geolocation + APIKEY
print(url)

url = googleGeocodeUrl + keyword + geolocation + APIKEY
json_response = urllib.request.urlopen(url)
search = json_response.read().decode('utf-8')
searchjson = json.loads(search)

export = open('hopital.csv','w')
for place in searchjson['results']:
    print(place['name'])
    print(place['geometry']['location'])
export.write(place['name']+','+str(place['geometry']['location']['lng'])\
 +','+str(place['geometry']['location']['lat'])+'\n')
export.close() 

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Используйте библиотеку Python csv для чтения и записи файлов CSV.Также лучше использовать строку формата, чтобы помочь вставить ваши переменные в ваш URL:

import csv
import urllib
import urllib.request
import json

googleGeocodeUrl = 'https://maps.googleapis.com/maps/api/place/textsearch/json?query={}&location={},{}&radius=5000&key={}'
keyword = "hospital"
key = '123'

with open('input.csv', newline='') as f_input, open('hospital.csv', 'w', newline='') as f_output:
    csv_input = csv.reader(f_input)
    csv_output = csv.writer(f_output)
    csv_output.writerow(['Search place', 'Name', 'Lat', 'Long'])

    for search_place, lat, long in csv_input:
        url = googleGeocodeUrl.format(urllib.parse.quote(search_place), lat, long, key)
        json_response = urllib.request.urlopen(url)
        search = json_response.read().decode('utf-8')
        searchjson = json.loads(search)

        for place in searchjson['results']:
            row = [place['name'], place['geometry']['location']['lng'], place['geometry']['location']['lat']]
            csv_output.writerow(row)

Строка формата работает с использованием довольно мощного мини-языка, но в простейшем случае вам просто нужно добавить {} в качестве заполнителя для того, что вы хотите заменить.Для каждого используемого {} формат заменяет его соответствующим аргументом при вызове, например,

'test{}'.format(123)
'lat is {}, long is {}'.format(123, 456)
0 голосов
/ 31 мая 2018

Для этой цели вы можете использовать библиотеку csv, входящую в стандартную библиотеку Python.

В частности, csv.DictReader () и csv.writer ()

csv.DictReader() пример:

import csv

with open('places.csv', newline='') as f:
    reader = csv.DictReader(f, fieldnames=["place", "longitude", "latitude"])
    places = [row for row in reader]

for row in places:
    # your code here

csv.writer() пример:

import csv

with open('hopital.csv','w', newline='') as f:
    writer = csv.writer(f)
    for place in searchjson['results']:
        writer.writerow([place['name'],
            str(place['geometry']['location']['lng']),
            str(place['geometry']['location']['lat'])])

Кроме того, вы также можете использовать urllib.parse.urlencode () для автоматической генерации строки аргумента из набора параметров и значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...