【问题标题】:using Python to import a CSV (lookup table) and add GPS coordinates to another output CSV使用 Python 导入 CSV(查找表)并将 GPS 坐标添加到另一个输出 CSV
【发布时间】:2010-08-06 14:30:03
【问题描述】:

所以我已经导入了一个包含 3000 个元素的 XML-ish 文件,并将它们解析为 CSV 用于输出。但我还需要导入第二个以“关键字”、“纬度”、“经度”为列的 CSV 文件,并使用它将 GPS 坐标添加到第一个文件的其他列中。

阅读 python 教程,似乎 {dictionary} 是我需要的,尽管我在这里读到元组可能会更好。我不知道。

但无论哪种方式 - 我开始:

    floc = open('c:\python\kenya_location_lookup.csv','r')
    l = csv.DictReader(floc)
    for row in l: print row.keys()

输出如下:

{'LATITUDE': '-1.311467078', 'LONGITUDE': '36.77352011', 'KEYWORD': 'Kianda'} {'纬度':'-1.315288401','经度':'36.77614331','关键字':'索韦托'} {'纬度':'-1.315446430425027','经度':'36.78170621395111','关键字':'Gatwekera'} {'纬度':'-1.3136151425171327','经度':'36.785863637924194','关键字':'Kisumu Ndogo'}

我是新手(而不是程序员)。问题是如何使用键提取相应的行数据并将其与另一组元素正文中的单词进行匹配?

【问题讨论】:

  • “将其与另一组元素正文中的单词匹配”是什么意思?

标签: python dictionary csv gps geocoding


【解决方案1】:

看python教程,好像 像 {dictionary} 是我需要的, 虽然我在这里读过元组 可能会更好。我不知道。

它们都是这项任务的好选择。

print row.keys()输出看看 喜欢:

{'LATITUDE': '-1.311467078',

不,它没有!这是print row 的输出,绝对是NOT print row.keys()。请不要在你的问题中提供虚假信息,这会让它们很难有效地回答(作为一个新手也没什么区别:你当然可以检查你提供的输出是否真的来自你也提供的代码!)。

我是新手(而不是程序员)。 问题是如何使用密钥 抽出对应的行数据 并将其与正文中的单词匹配 另一个集合中的元素?

既然你给我们关于“另一组”结构的绝对零信息,你当然不可能回答这个问题。疯狂地猜测,例如,如果“另一组”中的条目也是dicts,每个都有一个KEYWORD 的键,你想先构建一个辅助字典,然后合并(一些)它在“其他”中的条目设置”:

l = csv.DictReader(floc)
dloc = dict((d['KEYWORD'], d) for d in l)
for d in otherset:
  d.update(dloc.get(d['KEYWORD'], ()))

当 CSV 中的相应关键字条目中不存在该位置时,这将使另一组中的位置丢失 - 如果这是一个问题,您可能希望使用“假位置”字典作为缺失条目的默认值,而不是那个() 在我展示的最后一条语句中。但是,无论如何,这都是胡乱猜测,因为您的 Q 中缺乏信息。

【讨论】:

  • 我的错。我输入的命令是用于 l 中的行:打印没有 .keys() 的行。对不起。我正在调试并摆弄各种类型的输出,以了解数据是如何存储的。
【解决方案2】:

如果您将 DictReader 转储到列表 (data = [row for row in csv.DictReader(file)]) 中,并且每一行都有唯一的关键字,则将该字典列表转换为字典字典,使用该关键字作为键。

>>> data = [row for row in csv.DictReader(open('C:\\my.csv'),
...                                       ('num','time','time2'))]
>>> len(data)  # lots of old data :P
1410
>>> data[1].keys()
['time2', 'num', 'time']
>>> keyeddata = {}
>>> for row in data[2:]:  # I have some junk rows
...     keyeddata[row['num']] = row
...
>>> keyeddata['32']
{'num': '32', 'time2': '8', 'time': '13269'}

一旦您提取了关键字,您就可以遍历您的其他列表,从中获取关键字,并将其用作纬度/经度列表的索引。从该索引中提取纬度/经度并将其添加到另一个列表中。

【讨论】:

  • 谢谢!我将在今天晚些时候对此进行测试 - 不幸的是,我先在会议中停留了一段时间。
  • 谢谢 - 我有你的代码工作,但我仍然不知道引用字典中匹配关键字“kibera”的“位置”部分的语法。在您的示例中, Keyeddata['32'] 返回 'num' = '32' 的 {dict}。您将如何分配 x = 对应于 ('num'=32) 的“时间”?
【解决方案3】:

谢谢 -

Alex:我的另一组代码正在运行,唯一相关的部分是我有一个字符串,它可能包含也可能不包含此字典中的“关键字”。

在结构上,我是这样组织的:

def main():
    f = open('c:\python\ggce.sms', 'r')
    sensetree = etree.parse(f)
    senses = sensetree.getiterator('SenseMakingItem')
    bodies = sensetree.getiterator('Body')       
    stories = []
    for body in bodies:
            fix_body(body)
            storybyte = unicode(body.text)
            storybit = storybyte.encode('ascii','ignore')
            stories.append(storybit)
    rows = [ids,titles,locations,stories]
    out = map(None, *rows)
    print out[120:121]
    write_data(out,'c:\python\output_test.csv')

(我省略了获取其、标题、位置的代码,因为它们可以工作,并且不会用于从故事中的数据中获取真实位置)

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-17
    • 2022-01-09
    • 2014-06-11
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    相关资源
    最近更新 更多