использование Python для импорта CSV (справочной таблицы) и добавления координат GPS в другой выходной CSV - PullRequest
0 голосов
/ 06 августа 2010

Итак, я уже импортировал один XML-файл с 3000 элементами и проанализировал их в CSV для вывода. Но мне также нужно импортировать второй CSV-файл с ключевыми словами, «широтой», «долготой» в качестве столбцов и использовать его для добавления координат GPS в дополнительные столбцы первого файла.

Читая учебник по питону, мне кажется, что {словарь} - это то, что мне нужно, хотя я читал здесь, что кортежи могут быть лучше. Я не знаю.

Но в любом случае - я начинаю с:

    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 '} {'LATITUDE': '-1.315288401', 'LONGITUDE': '36 .77614331 ',' KEYWORD ':' Soweto '} {'LATITUDE': '-1.315446430425027', 'LONGITUDE': '36 .78170621395111 ',' KEYWORD ':' Gatwekera '} {'LATITUDE': '-1.3136151425171327', 'LONGITUDE': '36 .785863637924194 ',' KEYWORD ':' Kisumu Ndogo '}

Я новичок (а не программист). Вопрос в том, как использовать ключи, чтобы извлечь соответствующие данные строки и сопоставить их со словами в теле элемента в другом наборе?

Ответы [ 3 ]

1 голос
/ 06 августа 2010

Читая учебник по питону, мне кажется, что {словарь} - это то, что мне нужно, хотя я читал здесь, что кортежи могут быть лучше.Я не знаю.

Оба варианта отлично подходят для этой задачи.

print row.keys() Вывод выглядит так:

{'LATITUDE': '-1.311467078',

Нет, это не так!Это вывод из print row, наиболее определенно НЕ print row.keys().Пожалуйста, не вводите дезинформацию в своих вопросах, это затрудняет эффективный ответ (будучи новичком, нет никакой разницы: конечно, вы можете проверить, что вывод, который вы предоставляете, на самом деле происходит из кода, который вы также предоставляете!).

Я новичок (а не программист).Вопрос в том, как использовать ключи, чтобы извлечь соответствующие данные строки и сопоставить их со словами в теле элемента в другом наборе?

Поскольку вы предоставляете нам абсолютно нулевую информацию о структуре«другого набора», вы, конечно же, не можете ответить на этот вопрос.Неожиданно догадываясь, что если, например, записи в «другом наборе» также имеют dict с ключом KEYWORD, сначала нужно создать вспомогательный дикт, а затем объединить (некоторые из) его записей в «другом».set ":

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

Это позволит оставить местоположение отсутствующим в другом наборе, если его нет в соответствующей записи ключевого слова в CSV - если это проблема, вы можете использовать словарь" поддельное местоположение "в качестве значения по умолчанию для пропущенных записей вместо этого () в последнем утверждении, которое я показал.Но все равно это все дикие предположения из-за недостатка информации в вашем вопросе.

0 голосов
/ 06 августа 2010

Спасибо -

Алекс: Мой код для другого набора работает, и единственная важная часть состоит в том, что у меня есть строка, которая может содержать или не содержать ключевое слово в этом словаре.

Структурно, вот как я это организовал:

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')

(я опустил код для получения его, названий, местоположений, потому что они работают и не будут использоваться для получения реальных местоположений из данных в историях)

Надеюсь, это поможет.

0 голосов
/ 06 августа 2010

Если вы выгружаете 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'}

После того как вы вынули ключевое слово, вы можете перебирать другой список, извлекать из него ключевое слово и использовать его в качестве индекса для списка lat / long.Извлеките лат / лонг из этого индекса и добавьте его в другой список.

...