Package: iso3166-2
ISO 3166-2 🌎iso3166-2is a lightweight custom-built Python package, and accompanying API, that can be used to access all of the world's ISO 3166-2 subdivision data. A plethora of data attributes are available per country and subdivision including: name, local name, code, parent code, type, lat/longitude and flag. Currently, the package and API supports data from 250 countries/territories, according to the ISO 3166-1 standard. The software uses another custom-built Python package callediso3166-updatesto ensure all the subdivision data is accurate, reliable and up-to-date.The front-endAPIis availablehere.Ademoof the software and API is availablehere.Ademoof the script used to pull and export all the latest ISO 3166-2 data is availablehere.AMediumarticle that dives deeper intoiso3166-2is availablehere.Table of ContentsIntroductionLatest UpdatesAPIRequirementsInstallationUsageIssuesContactReferencesIntroductioniso3166-2is a lightweight custom-built Python package, and accompanying API, that can be used to access all of the world's ISO 3166-2 subdivision data. Here, subdivision can be used interchangably with regions/states/provinces etc. Currently, the package and API supports data from 250 countries/territories, according to the ISO 3166-1 standard. The software uses another custom-built Python package callediso3166-updatesto ensure all the subdivision data is accurate, reliable and up-to-date. The full list of subdivision data attributes supported are:Name (subdivsion name)Local name (subdivision name in local language)Code (subdivision code)Parent Code (subdivision parent code)Type (subdivision type, e.g. region, state, canton, parish etc)Latitude/Longitude (subdivision coordinates)Flag (subdivsion flag fromiso3166-flag-iconsrepo)The International Organisation for Standards defines codes for the names of countries, dependent territories, special areas of geographical interest, and their principal subdivisions[1]. The ISO 3166-2 defines codes for identifying the principal subdivisions (e.g. provinces, states, municipality etc) of all countries coded in the ISO 3166-1. The official name of the standard is "Codes for the representation of names of countries and their subdivisions – Part 2: Country subdivision code." For some countries, codes are defined for more than one level of subdivisions. Currently, this package and accompanying API support 250 officially assigned code elements along with the user assigned code XK (Kosovo). Transitional reservations are not included and only 4 of the exceptional reservations, that have now been officially assigned, are included: AX (Aland Islands), GG (Guernsey), IM (Isle of Man) and JE (Jersey)[3].The ISO 3166-2 was first published in 1998 and as of November 2023 there are 5,039 codes defined in it[2].Latest UpdatesAn important thing to note about the ISO 3166-2 and its subdivision codes/names is that changes are made consistently to it, from a small subdivision name change to an addition/deletion of a whole subdivision. These changes can happen due for a variety of geopolitical and administrative reasons. Therefore, it's important that this library and its JSON have the most up-to-date, accurate and reliable data. To achieve this, the custom-builtiso3166-updatesrepo was created.Theiso3166-updatesrepo is another open-source software package and accompanying API that pulls the latest updates and changes for any and all countries in the ISO 3166 from a variety of data sources including the ISO website itself. A script is called every few months to check for any updates/changes to the subdivisions, which are communicated via the ISO's Online Browsing Platform[4], and will then be manually incorporated into this repo. Please visit the repository home page for more info about the purpose and process of the software and API -iso3166-updates.The list of ISO 3166 updates was last updated onNov 2023. A log of the latest ISO 3166 updates can be seen in theUPDATES.mdfile.APIThe main API endpoint is:https://iso3166-2-api.vercel.app/apiThe other endpoints available in the API are:https://iso3166-2-api.vercel.app/api/allhttps://iso3166-2-api.vercel.app/api/alpha2/<input_alpha2>https://iso3166-2-api.vercel.app/api/name/<input_name>Three paths/endpoints are available in the API -/api/all,/api/alpha2and/api/name.The/api/allpath/endpoint returns all of the ISO 3166 subdivision data for all countries.The/api/alpha2endpoint accepts the 2 letter alpha-2 country code appended to the path/endpoint e.g./api/alpha2/JP. A single alpha-2 code or list of them can be passed to the API e.g./api/alpha2/FR,DE,HU,ID,MA. For redundancy, the 3 letter alpha-3 counterpart for each country's alpha-2 code can also be appended to the path e.g./api/alpha2/FRA,DEU,HUN,IDN,MAR. If an invalid alpha-2 code is input then an error will be returned.The/api/nameendpoint accepts the country/territory name as it is most commonly known in english, according to the ISO 3166-1. The name can similarly be appended to thenamepath/endpoint e.g./api/name/Denmark. A single country name or list of them can be passed into the API e.g./name/France,Moldova,Benin. A closeness function is utilised so the most approximate name from the input will be used e.g. Sweden will be used if input is/api/name/Swede. If no country is found from the closeness function or an invalid name is input then an error will be returned.The main API endpoint (/or/api) will return the homepage and API documentation.The API documentation and usage with all useful commands and examples to the API is available on theAPI.mdfile. A demo of the software and API is availablehere.Requirementspython>= 3.8iso3166>= 2.1.1Requirements (iso3166_2_scripts/get_iso3166_2.py)python>= 3.8iso3166-2>= 1.5.0requests>= 2.28.1iso3166>= 2.1.1pycountry>= 22.3.5googlemaps>= 4.10.0tqdm>= 4.64.0natsort>= 8.4.0pandas>= 1.4.3numpy>= 1.23.2InstallationInstall the latest version ofiso3166-2viaPyPiusing pip:pip3installiso3166-2--upgradeInstallation from source:gitclone-bmasterhttps://github.com/amckenna41/iso3166-2.gitcdiso3166_2
python3setup.pyinstallUsageThe main JSONiso3166-2.jsoncontains each country's ISO 3166-2 subdivision data and attributes. In the main module,iso3166_2.py, all data from theiso3166-2.jsonis accessible via theiso.countryobject.Import ISO3166_2 class and access the subdivision data:importiso3166_2asiso#access all country's subdivision datacanada_iso3166_2=iso.country["CA"]denmark_iso3166_2=iso.country["DK"]estonia_iso3166_2=iso.country["EE"]fiji_haiti_guyana_iso3166_2=iso.country["FJ, HT, GY"]peru_iso3166_2=iso.country["PE"]Get a specific subdivision's info:importiso3166_2asisocanada_iso3166_2['CA-AB']#Alberta subdivisiondenmark_iso3166_2['DK-81']#Nordjylland subdivisionestonia_iso3166_2['EE-899']#Viljandi subdivisionfiji_haiti_guyana_iso3166_2['FJ-03']#Cakaudrove subdivisionperu_iso3166_2['PE-AMA']#Amarumayu subdivisionGet individual attribute values per subdivision:importiso3166_2asisocanada_iso3166_2['CA-AB'].latLng#Alberta subdivision latitude/longitudedenmark_iso3166_2['DK-81'].flagUrl#Nordjylland subdivision flag URLestonia_iso3166_2['EE-899'].name#Viljandi subdivision namefiji_haiti_guyana_iso3166_2['FJ-03'].type#Cakaudrove subdivision typeperu_iso3166_2['PE-AMA'].parentCode#Amarumayu subdivisionGet all ISO 3166-2 data for all countries:importiso3166_2asiso#get all subdivision data using all attributeiso.country.allAdding a custom subdivision to the iso3166-2 object. The context for this
functionality is similar to that of the user-assigned code elements of the
ISO 3166-1 standard. Custom subdivisions and subdivision codes can be used
for in-house/bespoke applications that are using the iso3166-2 software but
require additional custom subdivisions to be represented:importiso3166_2asiso#adding custom Belfast province to Irelandiso.country.custom_subdivision("IE","IE-BF",name="Belfast",local_name="Béal Feirste",type="province",lat_lng=[54.596,-5.931],parent_code=None,flag_url=None)Searching for a specific subdivision via its subdivision name attribute. The
search functionality will search over all subdivisions in the object,
returning either a subdivision with the exact match or subdivisions whose
names approximately match the sought input name:importiso3166_2asiso#searching for the Monaghan county in Ireland (IE-MN) - returning exact matching subdivisioniso.country.search("Monaghan",any=False)#searching for any subdivisions that have "Southern" in their nameiso.country.search("Southern",any=True)Usage (iso3166_2_scripts/get_iso3166_2.py)The scriptiso3166_2_scripts/get_iso3166_2.pyis used for gathering and exporting subdivision data for ALL countries to the JSON object. It uses thepycountryandgooglemapspackages to gather and export all the required subdivision info. Calling the script using its default parameters will gather all the data for ALL countries, but thealpha2_codesparameter can be set to pull the latest data for a specific list of one or more countries (the alpha-3 code can also be input, which is then converted into its 2 letter alpha-2 counterpart).To download all of the latest ISO 3166-2 subdivision data for ALL countries, from the main repo dir, run theget_iso3166_2.pyin a terminal or command line below; (the script takes around1 hour and 40 minsto execute):python3iso3166_2_scripts/get_iso3166_2.py--json_filename=iso3166_2.json--output_folder=iso3166_2--verbose#--alpha2_codes: list of 1 or more 2 letter alpha-2 country codes (if not specified then all country codes will be used).#--json_filename: output filename for exported JSONs.#--output_folder: output folder to store JSONs.#--verbose: if set to 1 then the progress of the ISO 3166-2 data export will be output.To download all of the latest ISO 3166-2 subdivision data for Germany, Portugal and Spain (the data will be exported to a JSON called iso3166_2-DE,ES,PT.json):python3iso3166_2_scripts/get_iso3166_2.py--alpha2_codes=DE,PT,ES--json_filename=iso3166_2.jsonUsage (iso3166_2_scripts/update_subdivisions.py)The scriptiso3166_2_scripts/update_subdivisions.pyhas theupdate_subdivision()function that was created to streamline the addition/amendment/deletion to any of the subdivisions in the data object. The function can accept an individual subdivision change by passing in all the required attribute values to the function directly. Alternatively, aCSVfile with rows of the individual changes can be passed in, allowing for hundreds of changes to be made in one go.The primary input parameters to theupdate_subdivision()function are:alpha2_code, subdivision_code, name, local_name, type, latLng, parent_code, flag_urlanddelete. The first eight parameters represent the data to be added/changed to the specified country code and subdivision code (alpha2_code, subdivision_code) anddeleteis a boolean flag that should be set (0/1) if the input subdivision is to be deleted - by default this will be 0. For any addition, amendment or deletion, thecountry_codeandsubdivision_codeparameters are required, but the remainder of the parameters are optional. If these optional parameters are not set then they will be set null, in the case of an addition or deletion, or remain as their previous values in the case of an amendment.As mentioned, you can also pass in aCSVwith rows of all the changes to be made to the subdivision object. TheCSVhas the same columns as the aforementioned function parameters, but additionally has thelocalNameSpelling, notesanddateIssuedcolumns.localNameSpellingshould be set to 1 if the subdivision local name is the same as its name, if the column is empty or 0 then the subdivision will take the value specified by thelocalNamecolumn.notesjust contains a small description about the addition/amendment/deletion being made anddateIssuedis the date that the subdivision change was communicated by the ISO.fromiso3166_2_scripts.update_subdivisionsimport*#adding Timimoun Province of Algeria (DZ-49) to ISO 3166-2 object (from newsletter 2022-11-29)update_subdivision("DZ","DZ-49",name="Timimoun",local_name="ولاية تيميمون",type="Province",latLng=[29.263,0.241],parent_code=None,flag_url=None)#adding Waterford County of Ireland (IE-WD) to ISO 3166-2 object - subdivision already present so no changes madeupdate_subdivision("IE","IE-WD","Waterford",local_name="Port Láirge",type="County",latLng=[52.260,-7.110],parent_code="IE-M",flag_url="https://github.com/amckenna41/iso3166-flag-icons/blob/main/iso3166-2-icons/IE/IE-WD.png")#iso.update_subdivision("IE", "IE-WD") - this will also work as only the first 2 params requried#amending the subdivision name of subdivision FI-17 from Satakunda to Satakunta (from newsletter 2022-11-29)update_subdivision("FI","FI-17",name="Satakunta")#deleting FR-GP (Guadeloupe) and (FR-MQ Martinique) subdivisionsupdate_subdivision("FR","FR-GP",delete=1)update_subdivision("FR","FR-MQ",delete=1)#error raised as both country_code and subdivision_code parameters requiredupdate_subdivision(type="region",latLng=[],parent_code=None)#passing in a csv with rows of subdivision additions/updates/deletionsupdate_subdivision(subdivision_csv="new_subdivisions.csv")Issues or ContributingAny issues, bugs or enhancements can be raised via theIssuestab in the repository. If you would like to contribute to this project, please make a PR.ContactIf you have any questions or comments, please contactamckenna41@qub.ac.ukor raise an issue in theIssuestab.References[1]:https://en.wikipedia.org/wiki/ISO_3166[2]:https://en.wikipedia.org/wiki/ISO_3166-2[3]:https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2[4]:https://www.iso.org/obp/ui/#SupportBack to top