Как преобразовать коды 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])