从csv文件Python

时间:2015-04-30 21:38:00

标签: python sorting csv dictionary location

我有一个看起来像这样的csv文件(Location Name,Lat,Long):

LocA, 40, 75
LocB, 100, -80
LocC, 45, 50
LocD, 20, -30
...

我有一个硬编码的起始位置(Lat,Long):

[20, -30]

使用欧几里得:

d = sqrt((x2 - x1)^2 + (y2 - y1)^2)

我需要一个与我的起点最近的位置的列表(或数组)。我被困在循环通过csv文件并从那里抓住所有纬度和经度。我不知道我是否应该在循环中进行计算,或者在我将所有内容保存在集合中之后再进行计算。我正在考虑使用字典,将所有内容放在那里,然后在循环之后进行计算。

# parse csv file using csv library
myCSV = csv.reader(open("temp.csv"))
dict = {}

# extract lats and longs in the csv file
for line in myCSV:

另一件事是预期的输出应该是这样的:

LocC, 45, 50
LocD, 20, -30
LocA, 40, 75
LocB, 100, -80
...

不是从最小到最大排序的数字列表。上面的例子只是指出输出应该是name + lat + long,而不是数字列表(距离)。我这里没有做实际的计算。如果正确计算,输出可能不同。我也被困在这里因为从最小到最大获取列表后,我该如何对原始csv文件进行排序?

1 个答案:

答案 0 :(得分:1)

使用regular expression

,这是一种方法
import math, re

def dist(a,b):
  return math.sqrt((a[0] - b[0])**2 + (a[1] - b[1])**2)

p = [20,-30]

stringdata = re.findall('(.*), (.*), (.*)',open('testdata').read())
data = [(l,int(x),int(y)) for l,x,y in stringdata]
sorteddata = sorted(data, key=lambda d: dist(p,d[1:]))

最后一行说,“排序data,其中每个元素ddist(p,d[1:])的值排序。”这实现了您提到的关于按距离排序但保持完整数据可访问的内容。