在Python中实现所有可能的组合,并将google API用于csv/xlsx文件

在Python中实现所有可能的组合,并将google API用于csv/xlsx文件,python,excel,csv,google-api,file-handling,Python,Excel,Csv,Google Api,File Handling,我必须用python编写一个脚本来执行以下操作 我有一个xlsx/csv文件,其中一列列出了300个城市 我必须在它们之间进行所有配对,并且借助谷歌api,我必须在第二列中添加它们的距离和旅行时间 我的CSV文件是这样的: ======= SOURCE ======= Agra Delhi Jaipur csv/xlsx文件中的预期输出如下所示 ============================================= SOURCE | DESTINATION | DI

我必须用python编写一个脚本来执行以下操作 我有一个xlsx/csv文件,其中一列列出了300个城市

  • 我必须在它们之间进行所有配对,并且借助谷歌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        
    
    等等。。如何做到这一点?

    注意:距离和旅行时间来自谷歌。

    您可以使用
    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')
    
    打印对的输出

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

    然后,您可以从列表元素1乘1点击api,并将结果保存在文件中。

    您可以通过使用
    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')
    

    要制作这些对,可以使用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() 
    

    你的文件中的城市是从第3行开始的吗?我可以删除标题。在运行脚本之后,我可以添加标题,它只有一行。这是有问题的,因为它将使问题更加清楚。所以城市从顶部开始你的问题无法测试,所以这是我能做的最好的。谢谢,我会试试这个。:)谢谢。它有效。:)谢谢你的努力。:)