Skip to main content

Fuzzy lookup of country information

Project description

countryguess looks up country information by country codes or name matching. It tries to be lean (but not mean) and fast: All dependencies are in the Python Standard Library and country data is loaded lazily on demand.

Code: Codeberg
Package: PyPI

Usage

guess_country() uses the default country data that is already packaged.

>>> from countryguess import guess_country
>>> guess_country("britain")
{
    'name_short': 'United Kingdom',
    'name_official': 'United Kingdom of Great Britain and Northern Ireland',
    'iso2': 'GB',
    'iso3': 'GBR',
    ...
}
>>> guess_country("no such country")
None
>>> guess_country("no such country", default="Oh, well.")
'Oh, well.'
>>> guess_country("PoRtUgAl", attribute="iso2")
'PT'
>>> guess_country("TW", attribute="name_official")  # 2-letter code lookup
'Republic of China'
>>> guess_country("tWn", attribute="name_short")    # 3-letter code lookup
'Taiwan'

Matching by regular expression can be extended by mapping ISO2 codes to re.Pattern objects.

>>> regex_map = {
...     "MN": re.compile(r'^mongol\s+uls$', flags=re.IGNORECASE),
...     "JP": re.compile(r'^ni(?:pp|h)on', flags=re.IGNORECASE),
... }
>>> guess_country("Mongol Uls", attribute="name_short", regex_map=regex_map)
'Mongolia'
>>> guess_country("Nippon", attribute="name_short", regex_map=regex_map)
'Japan'

You can also create a CountryData instance yourself to provide your own country data in a JSON file.

>>> from countryguess import CountryData
>>> countries = CountryData("path/to/countries.json")
>>> countries["vIeTnAm"]
{'name_short': 'Vietnam', ...}
>>> countries["vn"]
{'name_short': 'Vietnam', ...}
>>> countries["asdf"]
KeyError: 'asdf'
>>> countries.get("asdf")
None
>>> countries.get("kuwait")
{'name_short': 'Kuwait', ...}

On CountryData instances, every key in the JSON data is accessible as a method.

>>> countries.name_official("portugal")
'Portuguese Republic'
>>> countries.continent("vanuatu")
'Oceania'

Country Lookup

Countries are identified by name, 2-letter code (ISO 3166-1 alpha-2) or 3-letter code (ISO 3166-1 alpha-3). All identifiers are matched case-insensitively.

Names are matched with regular expressions that are stored in the JSON data. If that fails, fuzzy matching against name_short and name_official is done with difflib.

Country Data

Country information is read from a JSON file. One is shipped with the package, but you can also provide your own to the CountryData class as described above. The information in the default file was gratefully extracted from country-converter. (Many thanks!)

The country data file must contain a list of JSON objects. Each object represents a country that must contain at least the following keys:

  • name_short
  • name_official
  • iso2
  • iso3
  • regex

Packaged Classification Schemes

The following classification schemes are available in the included country data.

  1. ISO2 (ISO 3166-1 alpha-2) - including UK/EL for Britain/Greece (but always convert to GB/GR)
  2. ISO3 (ISO 3166-1 alpha-3)
  3. ISO - numeric (ISO 3166-1 numeric)
  4. UN numeric code (M.49 - follows to a large extend ISO-numeric)
  5. A standard or short name
  6. The "official" name
  7. Continent: 6 continent classification with Africa, Antarctica, Asia, Europe, America, Oceania
  8. Continent_7 classification - 7 continent classification spliting North/South America
  9. UN region
  10. EXIOBASE 1 classification (2 and 3 letters)
  11. EXIOBASE 2 classification (2 and 3 letters)
  12. EXIOBASE 3 classification (2 and 3 letters)
  13. WIOD classification
  14. Eora
  15. OECD membership (per year)
  16. MESSAGE 11-region classification
  17. IMAGE
  18. REMIND
  19. UN membership (per year)
  20. EU membership (including EU12, EU15, EU25, EU27, EU27_2007, EU28)
  21. EEA membership
  22. Schengen region
  23. Cecilia 2050 classification
  24. APEC
  25. BRIC
  26. BASIC
  27. CIS (as by 2019, excl. Turkmenistan)
  28. G7
  29. G20 (listing all EU member states as individual members)
  30. FAOcode (numeric)
  31. GBDcode (numeric - Global Burden of Disease country codes)
  32. IEA (World Energy Balances 2021)
  33. DACcode (numeric - OECD Development Assistance Committee)
  34. ccTLD - country code top-level domains
  35. GWcode - Gledisch & Ward numerical codes as published in https://www.andybeger.com/states/articles/statelists.html
  36. CC41 - common classification for MRIOs (list of countries found in all public MRIOs)
  37. IOC - International Olympic Committee (IOC) country codes
  38. BACI - BACI: International Trade Database at the Product-Level
  39. UNIDO - UNIDO INDSTAT database
  40. EXIOBASE hybrid 3 classification
  41. EXIOBASE hybrid 3 consequential classification
  42. GEOnumeric GEO numerical codes (also used in Prodcom)

Command Line Interface

countryguess comes with a simple CLI with the same name. It takes one or two arguments:

$ countryguess oman
{
    "name_short": "Oman",
    "name_official": "Sultanate of Oman",
    ...
}
$ countryguess 'puerto ricco' name_official
Puerto Rico

Contributing

All kinds of bug reports, feature requests and suggestions are welcome!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

countryguess-0.4.5.tar.gz (48.0 kB view details)

Uploaded Source

Built Distribution

countryguess-0.4.5-py3-none-any.whl (46.5 kB view details)

Uploaded Python 3

File details

Details for the file countryguess-0.4.5.tar.gz.

File metadata

  • Download URL: countryguess-0.4.5.tar.gz
  • Upload date:
  • Size: 48.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for countryguess-0.4.5.tar.gz
Algorithm Hash digest
SHA256 c8686eba1c766423bf4061ed231c610ff8386b4b848cf338f9287d642f5442de
MD5 58284bb1cce9e0e8c8e1b091834c9a67
BLAKE2b-256 1dc76db6c8ead087e8a17df82d80af67601bb106fab391068ddfdf92d2b22dac

See more details on using hashes here.

File details

Details for the file countryguess-0.4.5-py3-none-any.whl.

File metadata

  • Download URL: countryguess-0.4.5-py3-none-any.whl
  • Upload date:
  • Size: 46.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for countryguess-0.4.5-py3-none-any.whl
Algorithm Hash digest
SHA256 d28c399da70e9464526ed4288d7e6c3f5e0dcbb2cc19fa49991bd3b251945384
MD5 4a6f785a36a361c6b7232bdf38ee364b
BLAKE2b-256 fd5a29d62e5dc267b09d3a968c10b12cf23cddecccf49ccc237e2d3e70a4f686

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page