Скрипт для создания словаря из координат?

Новинка здесь, и это мой первый пост.

У меня есть скрипт python, над которым я работаю, и основная цель скриптов - взять список городов из файла .txt на моем компьютере и заставить скрипт выдать словарь, где ключами являются названия городов и значения являются местами как точечные объекты. Кроме того, я должен взять этот словарь точечных объектов и новое местоположение файла и записать новые значения в текстовый файл с данными в строках (названия городов рядом с координатами в словаре).

Я буквально потратил около 30 часов на это за последние 2 недели, и до сих пор не удалось заставить это работать полностью. Прямо сейчас названия городов и координаты будут распечатаны в оболочке python, и только названия городов будут распечатаны в текстовый файл, но я не могу объединить названия городов и координаты в один словарь для печати в один текст файл.

Я использую модуль python под названием location.pyc, и этот модуль предназначен для выхода в Интернет на сервер Google, а затем для ввода координат, связанных с названиями городов в списке. Все города на Аляске...

Это сценарий на данный момент.

import location         # calls the location module in file


def getFileList(path):
    f = open(path, "r")
    f.readline()
    fileList = []       # removes column header
    for line in f:
        fileList.append(line.strip())
    f.close()
    return fileList


class Point:
    def __init__(self, x = 0, y = 0):
        self.x = float(x)
        self.y = float(y)


def makeCitiesDict(citiesList):
    CitiesDict = dict()
    for city in citiesList:
        loc = location.getaddresslocation(city)
        x = loc[0]
        y = loc[1]
        CitiesDict[city] = Point(x, y)

    return CitiesDict

def writeDictFile(aDict):
    txt_file = open(r"Alaska.txt",'w')
    txt_file.writelines(myCitiesDict)
    txt_file.close()

myCities = getFileList(r"cities_Small.txt")

myCitiesDict = makeCitiesDict(myCities)
writeDictFile("myCitiesDict\n")   

print myCitiesDict

for key in myCitiesDict:
    point = myCitiesDict[key]
    print point.x,point.y

Вот ссылка на модуль location.pyc, который используется для запуска скрипта. location.pyc


person EDM    schedule 21.02.2015    source источник


Ответы (1)


Ваша текущая версия writeDictFile завершится ошибкой, когда вы передадите ей свой текущий большой словарь:

TypeError: аргумент writelines() должен быть последовательностью строк

Чтобы решить эту проблему, вы можете сделать несколько вещей:

  1. Переберите вручную пары ключ-значение в словаре и вручную запишите их в файл:

    def write_to_file(d):
        with open(outputfile, 'w') as f:
            for key, value in d.items():
                f.write('{}\t{}\t{}\n'.format(key, value.x, value.y))
    
  2. Используйте модуль csv, чтобы сделать всю работу за вас. Однако в этом случае вы захотите преобразовать свой один большой словарь в список маленьких словарей:

    def makeCitiesDict(citiesList):
        citylist = []
        for city in citiesList:
            loc = location.getaddresslocation(city)
            x = loc[0]
            y = loc[1]
            citylist.append({'cityname': city, 'lon': x, 'lat': y})
        return citylist
    
    
    def writeDictFile(biglist):
        with open(outputfile, 'w') as f:
            dw = csv.DictWriter(f, fieldnames=('lon', 'lat', 'cityname'), delimiter='\t')
            dw.writerows(biglist)
    

Кстати, соглашения о написании кода на Python предлагают не использовать camelCase для имен функций. Посмотрите PEP8, если вам интересно.

person Oliver W.    schedule 21.02.2015
comment
Я попытался импортировать модуль csv, но он выдает ошибку о том, что «истина» не определена, и я думаю, что это связано с тем, что модуль местоположения несовместим с модулем csv. Я нашел способ объединить название города с координатами в оболочке, но он все равно не будет печатать оба в выходном текстовом файле. Он просто по-прежнему печатает только названия городов в одной строке в текстовом файле. Как мне конкретно совместить координаты с именами в функции writeDictFile? - person EDM; 22.02.2015
comment
Я только сейчас добавил вызов функции writeDictFile в скрипт выше, как-то забыл его раньше, но он работает с этим вызовом функции. - person EDM; 22.02.2015
comment
@EDM, я хмурюсь, когда читаю, что у стороннего модуля будут проблемы совместимости с таким простым модулем из стандартной библиотеки. Тогда я предлагаю поискать альтернативу (например, geopy). Но, возможно, проблема не там, трудно сказать без полной трассировки стека. Во всяком случае, я не понимаю ваш первый комментарий: вы пробовали функцию write_to_file, показанную выше в первом примере? Это должна быть замена writeDictFile(myCitiesDict), если вы определяете переменную outputfile либо в локальной, либо в глобальной области. - person Oliver W.; 22.02.2015