使用python和googlemapsapi的距离表

2024-04-19 11:09:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用googlemapsapi来检查两点之间的距离,为此,我有两个文件工人.csv以及作业.csv. 在

目标是了解工人在每项工作中的距离。在

如果有3个工作和2个工作,预期结果是:

worker1, job1
worker1, job2
worker2, job1
worker2, job2
worker3, job1
worker3, job2

但代码只返回作业的第一项:

^{pr2}$

我相信错误在for

import googlemaps
import csv

gmaps = googlemaps.Client(key='TOKEN')

column_work = 0
column_job = 0

geo_worker = open('files/work.csv', 'r')
geo_job = open('files/job.csv', 'r')
out = open('files/output.csv', 'w', newline='')

try:
    open_work = csv.reader(geo_worker)
    open_job = csv.reader(geo_job)
    write = csv.writer(out)
    for row in list(open_job)[1:]:
        location_job = row[column_job]
        for row in list(open_work)[1:]:
            location_work = row[column_work]
            distance = gmaps.distance_matrix(location_work, location_job)
            print(distance)

finally:
    geo_worker.close()
    geo_job.close()
    out.close()

我还想得到表格格式的结果,在输出.csv以下模板中的文件:

worker1, distance(1,1), distance(1,2)
worker2, distance(2,1), distance(2,2)
worker3, distance(3,1), distance(1,2)

Tags: csvforjobcolumnlocationopenworkrow
1条回答
网友
1楼 · 发布于 2024-04-19 11:09:53

在将文件作为生成器处理时,一个非常常见的错误(实际上就是您正在做的),就是不要认为文件一旦被读取就会耗尽。也就是说,open_work数据只适用于第一个作业。在

该问题最常见的解决方案是首先将文件内容读入数据结构,然后重新使用该结构以使数据可用。因此,您必须引入一个额外的读循环。在

此外,要重新排列输出,需要将完整的解决方案存储在数据结构中,然后重新排列。因此,您需要一个循环来构建结构,一个循环用于打印。因此,您需要总共三个循环来解决这个问题。这可以解决为:

import googlemaps
import csv

gmaps = googlemaps.Client(key='TOKEN')

column_work = 0
column_job = 0

worker_pos = {}
worker_distance = {}

with open('files/work.csv', 'r') as geo_worker:
    open_work = csv.reader(geo_worker)
    open_work.next() # Your solution seems to drop the first line?
    for row_num, row in enumerate(open_work):
        worker_pos[row_num] = row[column_work]

with open('files/job.csv', 'r') as geo_job:
    open_job = csv.reader(geo_job)
    open_job.next() # Your solution seems to drop the first line?
    for row in open_job:
        location_job = row[column_job]
        for worker in worker_pos:
            if not worker_distance.has_key(worker)
                worker_distance[worker] = [] # list of distances to work
            distance = gmaps.distance_matrix(worker_pos[worker], location_job)
            worker_distance[worker].append(distance)

with open('files/output.csv', 'w', newline='') as out:
    write = csv.writer(out)
    sorted_keys = sorted(worker_distance.keys())
    for entry in sorted_keys:
        output_row = "worker{}".format(entry)
        for dist in worker_distance[entry]:
            output_row += ", {}".format(dist)
        write.writerow(formatted_output)    
        #print(formatted_output)

由于我不知道您的csv文件的结构,我不完全确定这个解决方案是否满足您的需要,但至少它应该让您走上正确的道路。在

相关问题 更多 >