ISO country, subdivision, language, currency and script definitions and their translations
Project description
pycountry provides the ISO databases for the standards:
- 639
Languages
- 3166
Countries
- 3166-3
Deleted countries
- 3166-2
Subdivisions of countries
- 4217
Currencies
- 15924
Scripts
The package includes a copy from Debian’s pkg-isocodes and makes the data accessible through a Python API.
Translation files for the various strings are included as well.
Data update policy
No changes to the data will be accepted into pycountry. This is a pure wrapper around the ISO standard using the pkg-isocodes database from Debian as is. If you need changes to the politicial situation in the world, please talk to the ISO or Debian people, not me.
Build status
The code lives in a bitbucket Mercurial repository, and issues must be reported in project bugtracker.
Countries (ISO 3166)
Countries are accessible through a database object that is already configured upon import of pycountry and works as an iterable:
>>> import pycountry >>> len(pycountry.countries) 249 >>> list(pycountry.countries)[0] Country(alpha_2='AF', alpha_3='AFG', name='Afghanistan', numeric='004', official_name='Islamic Republic of Afghanistan')
Specific countries can be looked up by their various codes and provide the information included in the standard as attributes:
>>> germany = pycountry.countries.get(alpha_2='DE') >>> germany Country(alpha_2='DE', alpha_3='DEU', name='Germany', numeric='276', official_name='Federal Republic of Germany') >>> germany.alpha_2 'DE' >>> germany.alpha_3 'DEU' >>> germany.numeric '276' >>> germany.name 'Germany' >>> germany.official_name 'Federal Republic of Germany'
The historic_countries database contains former countries that have been removed from the standard and are now included in ISO 3166-3, excluding existing ones:
>>> ussr = pycountry.historic_countries.get(alpha_2='SU') >>> ussr Country(alpha_3='SUN', alpha_4='SUHH', date_withdrawn='1992-08-30', name='USSR, Union of Soviet Socialist Republics', numeric='810') >>> ussr.alpha_4 'SUHH' >>> ussr.alpha_3 'SUN' >>> ussr.name 'USSR, Union of Soviet Socialist Republics' >>> ussr.date_withdrawn '1992-08-30'
Country subdivisions (ISO 3166-2)
The country subdivisions are a little more complex than the countries itself because they provide a nested and typed structure.
All subdivisons can be accessed directly:
>>> len(pycountry.subdivisions) 4847 >>> list(pycountry.subdivisions)[0] Subdivision(code='AD-07', country_code='AD', name='Andorra la Vella', parent_code=None, type='Parish')
Subdivisions can be accessed using their unique code and provide at least their code, name and type:
>>> de_st = pycountry.subdivisions.get(code='DE-ST') >>> de_st.code 'DE-ST' >>> de_st.name 'Sachsen-Anhalt' >>> de_st.type 'State' >>> de_st.country Country(alpha_2='DE', alpha_3='DEU', name='Germany', numeric='276', official_name='Federal Republic of Germany')
Some subdivisions specify another subdivision as a parent:
>>> al_br = pycountry.subdivisions.get(code='AL-BU') >>> al_br.code 'AL-BU' >>> al_br.name 'Bulqiz\xeb' >>> al_br.type 'District' >>> al_br.parent_code 'AL-09' >>> al_br.parent Subdivision(code='AL-09', country_code='AL', name='Dib\xebr', parent_code=None, type='County') >>> al_br.parent.name 'Dib\xebr'
The divisions of a single country can be queried using the country_code index:
>>> len(pycountry.subdivisions.get(country_code='DE')) 16>>> len(pycountry.subdivisions.get(country_code='US')) 57
Scripts (ISO 15924)
Scripts are available from a database similar to the countries:
>>> len(pycountry.scripts) 169 >>> list(pycountry.scripts)[0] Script(alpha_4='Afak', name='Afaka', numeric='439')>>> latin = pycountry.scripts.get(name='Latin') >>> latin Script(alpha_4='Latn', name='Latin', numeric='215') >>> latin.alpha4 'Latn' >>> latin.name 'Latin' >>> latin.numeric '215'
Currencies (ISO 4217)
The currencies database is, again, similar to the ones before:
>>> len(pycountry.currencies) 182 >>> list(pycountry.currencies)[0] Currency(letter='AED', name='UAE Dirham', numeric='784') >>> argentine_peso = pycountry.currencies.get(letter='ARS') >>> argentine_peso Currency(letter='ARS', name='Argentine Peso', numeric='032') >>> argentine_peso.letter 'ARS' >>> argentine_peso.name 'Argentine Peso' >>> argentine_peso.numeric '032'
Languages (ISO 639)
The languages database is similar too:
>>> len(pycountry.languages) 7874 >>> list(pycountry.languages)[0] Language(alpha_3='aaa', name='Ghotuo', scope='I', type='L')>>> aragonese = pycountry.languages.get(alpha_2='an') >>> aragonese.alpha_2 'an' >>> aragonese.alpha_3 'arg' >>> aragonese.name 'Aragonese'>>> bengali = pycountry.languages.get(iso639_1_code='bn') >>> bengali.name 'Bengali' >>> bengali.common_name 'Bangla'
Locales
Locales are available in the pycountry.LOCALES_DIR subdirectory of this package. The translation domains are called isoXXX according to the standard they provide translations for. The directory is structured in a way compatible to Python’s gettext module.
Here is an example translating language names:
>>> import gettext >>> german = gettext.translation('iso3166', pycountry.LOCALES_DIR, ... languages=['de']) >>> german.install() >>> _('Germany') 'Deutschland'
Lookups
For each database (countries, languages, scripts, etc.), you can also look up entities case insensitively without knowing which key the value may match. For example:
>>> pycountry.countries.lookup('de') <pycountry.db.Country object at 0x...>
The search ends with the first match, which is returned.
Changes
16.10.23rc2 (2016-10-23)
Adapt README to the new attributes.
16.10.23rc1 (2016-10-23)
This is a major change. The upstream packages have been revamped from the former XML databases to use JSON. They adapted their schemata a bit and thus made some of the structures in pycountry superfluous (yay!). Memory usage went down when all databases are loaded (32.7 MiB down from 83.6 MiB) and performance has gone up (not measured scientifically, but it’s noticable when loading the DBs in an interactive session).
To mark this major change, I’m also switch from the existing (not useful) SemVer-based version numbers to CalVer-based numbers using YY.MM.DD.micro as the pattern.
To avoid adding more complexity I have removed code that really only was necessary because of the complexity of using the XML databases.
Here’s what you need to know:
I updated to iso-codes 3.70 which is a lot fresher than the last release.
Attribute names have changed. There is no longer a mapping going on between the sources and the object attributes. Take a look at the JSON files (or inspect the objects) to see which fields are supported.
You can also inspect the automatically build indexes (db.indices) to see all keys in a database. Not every object supports every attribute - this depends on the quality of the data from pkg-isocodes.
Attribute names are more coherent now, too. Note that “alpha2”, “alpha4”, etc. are now using an underscore as that’s the pattern in the upstream packages. So it’s “alpha_2” now.
HistoricCountries no longer includes countries that still exist. I removed the computed fields that were meant to make it easy to filter.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file pycountry-16.10.23rc2.tar.gz
.
File metadata
- Download URL: pycountry-16.10.23rc2.tar.gz
- Upload date:
- Size: 9.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | cf807139987c496bbbbd76f79b1b6c34ae926818f100d4a19f72561e2d94fada |
|
MD5 | 1dba2ca472e714819c3d83144bdc7471 |
|
BLAKE2b-256 | 34b5936ebdfdc635b5acab997333a6c8e60b9e827aaed78f423a260c67d198ab |