Как преобразовать коды ISO 3166-1 в название стран?

Например, хочу преобразовать этот массив:

countries=['CA', 'FR', ...]

в такой:

countries=['Канада', 'Франция', ...]

Ответы (4 шт):

Автор решения: Rufat

Можно получить используя pycountry и gettext:

import gettext
import pycountry

russian = gettext.translation("iso3166", pycountry.LOCALES_DIR, languages=["ru"])
russian.install()

def get_country(code):
    ru = pycountry.countries.get(alpha_2=code)
    return _(ru.name)

print(get_country("RU"))
print(get_country("US"))
print(get_country("DE"))
print(get_country("CA"))
print(get_country("FR"))

Вариант с использованием pycountry и gettext позволяет получить также 3-х значный код, полное описание страны и название страны практически на любом языке.

Полный список языков здесь: https://github.com/flyingcircusio/pycountry/tree/master/src/pycountry/locales.

В вышеуказанном примере используется только получение названия страны на русском языке по двухзначному коду.

→ Ссылка
Автор решения: MaxU

самописный вариант:

import requests

json_url_pat = "https://raw.githubusercontent.com/stefangabos/world_countries/master/data/{}/countries.json"

def get_country_data(country_alpha2, url_pat=json_url_pat):
    r = requests.get(json_url_pat.format(country_alpha2.lower()))
    r.raise_for_status()
    return r.json()

data = get_country_data("RU")

def get_country_name(alpha2, data=data):
    res = [d.get("name") for d in data
           if d.get("alpha2") == alpha2.lower()]
    if res:
        return res[0]
    return None


res = [get_country_name(c) for c in countries]

результат:

In [30]: res
Out[30]: ['Канада', 'Франция']
→ Ссылка
Автор решения: gil9red

Самописный вариант через парсинг википедии (с сохранением кэша):

import json
from pathlib import Path

from bs4 import BeautifulSoup
import requests


FILE_NAME_COUNTRY = Path(__file__).resolve().parent / 'alpha2_to_country.json'
ALPHA2_TO_COUNTRY = None


def init():
    global ALPHA2_TO_COUNTRY

    if FILE_NAME_COUNTRY.exists():
        ALPHA2_TO_COUNTRY = json.loads(
            FILE_NAME_COUNTRY.read_text('utf-8')
        )
        return

    rs = requests.get('https://ru.wikipedia.org/wiki/ISO_3166-1')
    root = BeautifulSoup(rs.content, 'html.parser')

    ALPHA2_TO_COUNTRY = dict()

    for tr in root.select_one('.wikitable').select('tr'):
        td_list = tr.select('td')
        if not td_list:
            continue

        td_country, td_alpha2, td_alpha3, td_num_code, _ = td_list
        country = td_country.get_text(strip=True)
        alpha2 = td_alpha2.get_text(strip=True)

        ALPHA2_TO_COUNTRY[alpha2] = country

    json.dump(
        ALPHA2_TO_COUNTRY,
        open(FILE_NAME_COUNTRY, 'w', encoding='utf-8'),
        ensure_ascii=False,
        indent=4
    )


init()


def get_country(alpha2: str) -> str:
    return ALPHA2_TO_COUNTRY[alpha2]


print(get_country('RU'))
# Россия

print(get_country('US'))
# США

print(get_country('DE'))
# Германия
→ Ссылка
Автор решения: dIm0n

Самописный вариант с использованием словаря!

countries = ['CA', 'FR']

country_dict = {'CA':'Канада', 'FR':'Франция'}

print([country_dict[country] for country in countries])
→ Ссылка