преобразование упорядоченного dict в python в обычный dict и извлечение значений

#python #python-3.x #dictionary #geocoding #reverse-geocoding

#python #python-3.x #словарь #геокодирование #обратное геокодирование

Вопрос:

У меня есть csv-файл с широтами и долготами.

 -37.8994,144.9799
-37.8063,144.9964
-37.8901,144.8885
  

У меня есть скрипт на python, который преобразует эти значения из геокодов в местоположения.

 import csv
import reverse_geocoder as rg 

with open('bb.csv', "rt", encoding='ascii') as infile:
    read = csv.reader(infile)
    for row in read :
        result = rg.search(row)
        print(type(result[0]))
        print(result)
  

вывод из скрипта

 Loading formatted geocoded file...
<class 'collections.OrderedDict'>
[OrderedDict([('lat', '-37.88214'), ('lon', '144.98215'), ('name', 'Elwood'), ('admin1', 'Victoria'), ('admin2', 'Port Phillip'), ('cc', 'AU')])]
<class 'collections.OrderedDict'>
[OrderedDict([('lat', '-37.8'), ('lon', '145'), ('name', 'Abbotsford'), ('admin1', 'Victoria'), ('admin2', ''), ('cc', 'AU')])]
<class 'collections.OrderedDict'>
[OrderedDict([('lat', '-37.857'), ('lon', '144.89769'), ('name', 'Williamstown'), ('admin1', 'Victoria'), ('admin2', 'Hobsons Bay'), ('cc', 'AU')])]
  

Я изо всех сил пытаюсь извлечь значения для ключей — name, admin1, admin2 и cc.

по сути, я хочу преобразовать значения lat, long в csv-файле в их значения местоположения и вставить эти значения обратно в CSV. Пожалуйста, кто-нибудь может помочь с этим.

Ответ №1:

Вас смущает печатное представление этих словарей в Python. Независимо от того, упорядочены они или нет, здесь нет никакой проблемы, просто вы не печатаете то, что, по вашим словам, хотите распечатать.

     for row in read:
        result = rg.search(row)
        print(type(result[0]))
        for item in result:
            print(",".join("'%s': '%s'" % (k,v) for k, v in item.items()))
            # or maybe
            print(",".join([item['lat'], item['lon']]))
  

Это похоже на то, как print(print) просто печатается представление print функции Python, а не ее фактическое содержимое (что в любом случае было бы совершенно бесполезно для обычного читателя).

Комментарии:

1. Я пробовал item. lat или item.name , но вместо этого мне пришлось использовать item[‘lat’], огромное спасибо @tripleee

Ответ №2:

Это легко, вы можете сделать json.dumps() (прямого dict() следует избегать из-за неупорядоченности):

 import csv
import reverse_geocoder as rg 
import json
from collections import OrderedDict

with open('bb.csv', "rt", encoding='ascii') as infile:
    read = csv.reader(infile)
    for row in read :
        result = rg.search(row)
        dicres = json.loads(json.dumps(OrderedDict(result)))
  

Теперь dicres ваш dict.