легкая библиотека Python для запроса названия города / штата по почтовому индексу?

Здесь довольно просто, я ищу легкую библиотеку, которая позволит мне найти пару город / штат для данного почтового индекса. Я использую django FWIW. Заранее спасибо.


person mikec    schedule 28.06.2012    source источник


Ответы (4)


Попробуйте pyzipcode. Пример с домашней страницы:

>>> from pyzipcode import ZipCodeDatabase
>>> zcdb = ZipCodeDatabase()
>>> zipcode = zcdb[54115]
>>> zipcode.zip
u'54115'
>>> zipcode.city
u'De Pere'
>>> zipcode.state
u'WI'
>>> zipcode.longitude
-88.078959999999995
>>> zipcode.latitude
44.42042
>>> zipcode.timezone
-6
person Mark Ransom    schedule 28.06.2012
comment
Не совместим с Python 3. Ошибка: pysqlite is not supported on Python 3. When using Python 3, use the sqlite3 module from the standard library. Я советую использовать uszipcode для Python 3. - person Blairg23; 28.01.2017
comment
Я обнаружил, что в pyzipcode отсутствует ряд почтовых индексов, и когда вы запрашиваете эти почтовые индексы, он просто вылетает. Таким образом, добавление этой библиотеки не только не помогло мне определить расстояние до местоположения, но и привело к сбою моего приложения. - person Doubledown; 02.08.2018
comment
@exballer, что жаль, спасибо за предупреждение. Можно ли отловить эти ошибки? - person Mark Ransom; 02.08.2018
comment
Что бы это ни стоило, похоже, что на данный момент он работает в Python 3, и я не нашел почтовых индексов, которые он не мог найти (включая некоторые довольно неясные места) - person mdoc-2011; 27.10.2020

Используйте эту библиотеку uszipcode.

Преимущества:

  • Данные обновлены, информация очень богата, намного богаче и актуальнее, чем zipcode и pyzipcode и любая другая библиотека почтовых индексов Python.
  • Запрос очень простой, и вы можете использовать более 20 встроенных шаблонов запросов. И вы можете настроить свой запрос как хотите.
  • Поддержка нечеткого совпадения строк для города и штата. Вам не нужно использовать точное имя.
>>> from uszipcode import ZipcodeSearchEngine
>>> search = ZipcodeSearchEngine()
>>> zipcode = search.by_zipcode("10001")
>>> print(zipcode)
{
    "City": "New York", 
    "Density": 34035.48387096774, 
    "HouseOfUnits": 12476, 
    "LandArea": 0.62, 
    "Latitude": 40.75368539999999, 
    "Longitude": -73.9991637, 
    "NEBoundLatitude": 40.8282129, 
    "NEBoundLongitude": -73.9321059, 
    "Population": 21102, 
    "SWBoundLatitude": 40.743451, 
    "SWBoungLongitude": -74.00794499999998, 
    "State": "NY", 
    "TotalWages": 1031960117.0, 
    "WaterArea": 0.0, 
    "Wealthy": 48903.42702113544, 
    "Zipcode": "10001", 
    "ZipcodeType": "Standard"
}

# fuzzy city, state search, case insensitive, spelling mistake tolerant
# all zipcode in new york
>>> result = search.by_city_and_state(city="newyork", state="NY")
>>> search.export_to_csv(result, "result.csv")

Очень легко использовать для создания расширенного поиска

>>> result = search.find(city="new york", 
... wealthy=100000, sort_by="Wealthy", ascending=False, returns=10)
person MacSanhe    schedule 01.07.2016
comment
Это тот, который я начал использовать для Python3. Очень проста в использовании! - person Blairg23; 28.01.2017
comment
Я автор. Теперь последняя версия - 0.2.x, API, указанный выше, устарел. Прочтите документ uszipcode.readthedocs.io/?badge=latest. - person MacSanhe; 30.09.2018
comment
Отличный пакет! Есть ли способ вернуть все почтовые индексы? - person Rafael; 19.03.2020

Я создал почтовые индексы, чтобы убрать зависимость от SQLite, которая была у всех других библиотек почтовых индексов. SQLite недоступен в среде AWS Lambda, поэтому эта библиотека предоставляет легкий и мощный интерфейс запросов к сжатому с помощью gzip файлу JSON, содержащему данные почтового индекса США. Вот несколько примеров:

Соответствие:

>>> # Handles of Zip+4 zip-codes nicely. :)
>>> pprint(zipcodes.matching('77429-1145'))
[{'zip_code': '77429',
  'zip_code_type': 'STANDARD',
  'city': 'CYPRESS',
  'state': 'TX',
  'lat': 29.96,
  'long': -95.69,
  'world_region': 'NA',
  'country': 'US',
  'active': True}]

Срок действия:

>>> # Whether the zip-code exists within the database.
>>> print(zipcodes.is_valid('06463'))
False

Сходство:

>>> # Search for zipcodes that begin with a pattern.
>>> pprint(zipcodes.similar_to('0643'))
[{'active': True,
  'city': 'GUILFORD',
  'country': 'US',
  'lat': 41.28,
  'long': -72.67,
  'state': 'CT',
  'world_region': 'NA',
  'zip_code': '06437',
  'zip_code_type': 'STANDARD'},
 {'active': True,
  'city': 'HADDAM',
  'country': 'US',
  'lat': 41.45,
  'long': -72.5,
  'state': 'CT',
  'world_region': 'NA',
  'zip_code': '06438',
  'zip_code_type': 'STANDARD'},
... # remaining results truncated for readability...
]

Расширенная фильтрация:

>>> # Arbitrary nesting of similar_to and filter_by calls, allowing for great precision while filtering.
>>> pprint(zipcodes.similar_to('2', zips=zipcodes.filter_by(zipcodes.list_all(), active=True, city='WINDSOR')))
[{'active': True,
  'city': 'WINDSOR',
  'country': 'US',
  'lat': 33.48,
  'long': -81.51,
  'state': 'SC',
  'world_region': 'NA',
  'zip_code': '29856',
  'zip_code_type': 'STANDARD'},
 {'active': True,
  'city': 'WINDSOR',
  'country': 'US',
  'lat': 36.8,
  'long': -76.73,
  'state': 'VA',
  'world_region': 'NA',
  'zip_code': '23487',
  'zip_code_type': 'STANDARD'},
 {'active': True,
  'city': 'WINDSOR',
  'country': 'US',
  'lat': 36.0,
  'long': -76.94,
  'state': 'NC',
  'world_region': 'NA',
  'zip_code': '27983',
  'zip_code_type': 'STANDARD'}]
person Sean Pianka    schedule 17.10.2017

Последняя версия pyzipcode на PYPI уязвима для SQL-инъекций, поэтому, вероятно, лучше использовать эту вилку, которая похоже устранил проблемы.

person Joel Crocker    schedule 10.03.2014