2017-02-07 8 views
1

Мне нужно написать скрипт в python, который будет выполнять следующие действия У меня есть файл xlsx/csv, в котором есть 300 городов, перечисленных в одном колонкавсе возможное сочетание в Python, а также использование google API для файла csv/xlsx

  1. Я должен сделать все пары между ними, а также с помощью Google API я должен добавить их расстояние и время поездки во второй колонке

мой CSV файл это выглядит следующим образом :

======= 
SOURCE 
======= 
Agra 
Delhi 
Jaipur 

и ожидаемый выход в CSV файл/XLSX быть, как это

============================================= 
SOURCE | DESTINATION | DISTANCE | TIME_TRAVEL 
============================================= 
Agra | Delhi | 247 |  4  
Agra | Jaipur | 238 |  4  
Delhi | Agra  | 247 |  4  
Delhi | jaipur | 281 |  5 
Jaipur | Agra  | 238 |  4  
Jaipur | Delhi | 281 |  5   

и так далее .. как это сделать.?
ПРИМЕЧАНИЕ: Расстояние и время в пути от google.

+0

Город, начинающийся с строки 3 в вашем файле? – MYGz

+0

Я могу удалить заголовок. и после запуска скрипта я могу добавить заголовок. Это только одна строка. Это под вопросом, потому что это станет более ясным. Таким образом, города начинаются с вершины –

+0

Ваша проблема не может быть проверена, так что это лучшее, что я мог бы сделать. – MYGz

ответ

1

Чтобы сделать пары, вы можете использовать itertools.permutations, чтобы получить все возможные пары. код для такой же будет, как:

import csv  # imports the csv module 
import sys  # imports the sys module 
import ast 
import itertools  
source_list = [] 
destination_list = [] 
type_list = []list 
f = open(sys.argv[1], 'rb') 
g = open(sys.argv[2], 'wb') 
# opens the csv file 
try: 
    reader = csv.reader(f) 
    my_list = list(reader) # creates the reader object 
    for i in my_list: 
     source_list.append(i[0]) 
    a = list(itertools.permutations(source_list, 2)) 
    for i in a: 
     source_list.append(i[0]) 
     destination_list.append(i[1]) 
    mywriter=csv.writer(g) 
    rows = zip(source_list,destination_list) 
    mywriter.writerows(rows) 
    g.close() 

finally: 
    f.close() 

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

import csv  # imports the csv module 
import sys  # imports the sys module 
import urllib2,json 
import ast 
api_google_key = '' 
api_google_url = 'https://maps.googleapis.com/maps/api/distancematrix/json?origins=' 
source_list = [] 
destination_list = [] 
distance_list = [] 
duration_list = [] 
f = open(sys.argv[1], 'rb') 
g = open(sys.argv[2], 'wb') 
# opens the csv file 
try: 
    reader = csv.reader(f) 
    my_list = list(reader) # creates the reader object 
    for i in my_list: 
    if i: 
      s = (i[0]) 
     src = s.replace(" ","") 
      d = (i[1]) 
     dest = d.replace(" ","") 
     source = ''.join(e for e in src if e.isalnum()) 
     destination = ''.join(e for e in dest if e.isalnum()) 
     print 'source status = '+str(source.isalnum()) 
     print 'dest status = '+str(destination.isalnum()) 
     source_list.append(source) 
      destination_list.append(destination) 
      request = api_google_url+source+'&destinations='+destination+'&key='+api_google_key 
     print request 
      dist = json.load(urllib2.urlopen(request)) 
     if dist['rows']: 
       if 'duration' in dist['rows'][0]['elements'][0].keys(): 
         duration_dict = dist['rows'][0]['elements'][0]['duration']['text'] 
         distance_dict = dist['rows'][0]['elements'][0]['distance']['text'] 
       else: 
        duration_dict = 0 
        distance_dict = 0 
     else: 
       duration_dict = 0 
       distance_dict = 0 

      distance_list.append(distance_dict) 
      duration_list.append(duration_dict) 
    mywriter=csv.writer(g) 
    rows = zip(source_list,destination_list,distance_list,duration_list) 
    mywriter.writerows(rows) 
    g.close() 

finally: 
    f.close() 
+0

Большое спасибо. Оно работает. :) –

0

Вы можете получить все комбинации с itertools.permutations() так:

from itertools import permutations 

with open(cities_file, 'r') as f, open(newfile, 'w') as f2: 
    for pair in (permutations([a.strip() for a in f.read().splitlines()], 2)): 
     print pair 
     response = googleapi.get(pair) 
     f2.write(response+'\n') 

Выход print pair

('Agra', 'Delhi') 
('Agra', 'Jaipur') 
('Delhi', 'Agra') 
('Delhi', 'Jaipur') 
('Jaipur', 'Agra') 
('Jaipur', 'Delhi') 

Вы можете попасть в апи из списка элементов 1 на 1 и сохранить результат сохраняется в файле.

+0

Спасибо, я попробую это. :) –

+0

Спасибо за ваши усилия .. :) –

0

Вы можете сделать это, используя itertools.product, но это будет означать, что вы также получите повторения, такие как (Agra, Agra), расстояние, на которое будет действительно 0.

import itertools 
cities = ["Agra","Delhi","Jaipur"] 
cities2 = cities 
p = itertools.product(cities, cities2) 
print(list(p)) 

В этом случае вы получите

[('Agra', 'Agra'), ('Agra', 'Delhi'), ('Agra', 'Jaipur'), ('Delhi', 'Agra'), ('Delhi', 'Delhi'), ('Delhi', 'Jaipur'), ('Jaipur', 'Agra'), ('Jaipur', 'Delhi'), ('Jaipur', 'Jaipur')] 

Вы можете взять петлю в этом forlist и сделать запрос на Google, чтобы получить время и расстояние.

>>> for pair in list(p): 
...  print (pair) 
... 
('Agra', 'Agra') 
('Agra', 'Delhi') 
('Agra', 'Jaipur') 
('Delhi', 'Agra') 
('Delhi', 'Delhi') 
('Delhi', 'Jaipur') 
('Jaipur', 'Agra') 
('Jaipur', 'Delhi') 
('Jaipur', 'Jaipur') 
+0

Спасибо за ваши усилия. :) –