python 检查输入的国家是否是世界上的一个国家

sg3maiej  于 2023-06-28  发布在  Python
关注(0)|答案(9)|浏览(162)

是否有一种自动化的方法来检查输入的国家名称是否是python中的世界国家之一(即,是否有一种自动化的方法来获得世界上所有国家的列表?)

2w3kk1z5

2w3kk1z51#

我知道8个月前有人问过这个问题,但如果你来自谷歌(就像我一样),这里有一个很好的解决方案。
您可以使用位于此处的ISO标准库:https://pypi.python.org/pypi/iso3166/
这段代码取自该链接,以防您在将来某个时候收到404错误:

安装:

pip install iso3166

国家详细信息:

>>> from iso3166 import countries
>>> countries.get('us')
Country(name=u'United States', alpha2='US', alpha3='USA', numeric='840')
>>> countries.get('ala')
Country(name=u'\xc5land Islands', alpha2='AX', alpha3='ALA', numeric='248')
>>> countries.get(8)
Country(name=u'Albania', alpha2='AL', alpha3='ALB', numeric='008')

国家列表:

>>> from iso3166 import countries
>>> for c in countries:
>>>       print(c)
Country(name=u'Afghanistan', alpha2='AF', alpha3='AFG', numeric='004')
Country(name=u'\xc5land Islands', alpha2='AX', alpha3='ALA', numeric='248')
Country(name=u'Albania', alpha2='AL', alpha3='ALB', numeric='008')
Country(name=u'Algeria', alpha2='DZ', alpha3='DZA', numeric='012')
...

如果您希望遵循ISO提出的标准化,则此软件包是兼容的。根据Wikipedia:
ISO 3166是由国际标准化组织(ISO)发布的标准,定义了国家名称、附属领土、特殊地理区域及其主要细分(例如省或州)的代码。该标准的正式名称是“国家及其分区名称表示代码”。
因此,我强烈建议您在所有应用程序中使用此库,以防您使用国家/地区。
希望这份资料对社会有用!

v09wglhw

v09wglhw2#

更新

虽然使用pytz.country_names很方便,但看起来pytz就是on the way out(从Python 3.9开始)。
作为替代,Python的(first-partytzdata包提供了ISO 3166国家代码和名称的最新列表。
要使用来自tzdata的国家名称,请查看this example

原件

很有可能你已经在你的项目中安装了pytz,例如。如果你使用Django
下面是pytz文档中的一条注解:
Olson数据库附带了一个ISO 3166国家代码到英语国家名称的Map,pytz将其作为字典公开:
>>> print(pytz.country_names['nz'])
New Zealand
因此,使用pytz.country_names字典可能会很方便。
不知道ISO 3166表的更新情况如何,但至少pytz本身维护得很好,而且它目前(即根据https://pypistats.org/top的数据,2020年6月)在PyPI的“上个月下载量最多”的前20名中,所以就外部依赖而言,这可能不是一个糟糕的选择。

5lhxktic

5lhxktic3#

虽然这篇文章已经很老了,而且已经有人回答了,但我仍然想对这个问题提出我的解决方案:
我用Python写了一个函数,可以用来找出数据集中不正确的国家名称。
例如:
我们有一个国家名称列表,希望检查以找出无效的国家名称:
['UNITED STATES OF AMERICA','UNITED STATES OF AMERICA',' UNITED KINGDOM','UNTED KINGDOM',' GERMANY','MALAYSIA',....]
(Note:我已经使用我的函数将列表元素转换为大写,以便进行不区分大小写的比较)此列表中的国家名称条目不正确/拼写错误,例如:美利坚合众国,联合 Realm 。
为了识别这种异常情况,我编写了一个函数,可以识别这种无效的国家名称。
此函数使用Python的'pycountry'库,其中包含ISO国家名称。它提供了两个字母的国家名称,三个字母的国家名称,名称,通用名称,官方名称和数字国家代码。

函数定义

def country_name_check():
    pycntrylst = list(pc.countries)
    alpha_2 = []
    alpha_3 = []
    name = []
    common_name = []
    official_name = []
    invalid_countrynames =[]
    tobe_deleted = ['IRAN','SOUTH KOREA','NORTH KOREA','SUDAN','MACAU','REPUBLIC OF IRELAND']
    for i in pycntrylst:
        alpha_2.append(i.alpha_2)
        alpha_3.append(i.alpha_3)
        name.append(i.name)
        if hasattr(i, "common_name"):
            common_name.append(i.common_name)
        else:
            common_name.append("")
        if hasattr(i, "official_name"):
            official_name.append(i.official_name)
        else:
            official_name.append("")
    for j in input_country_list:
        if j not in map(str.upper,alpha_2) and j not in map(str.upper,alpha_3) and j not in map(str.upper,name) and j not in map(str.upper,common_name) and j not in map(str.upper,official_name):
            invalid_countrynames.append(j)
    invalid_countrynames = list(set(invalid_countrynames))
    invalid_countrynames = [item for item in invalid_countrynames if item not in tobe_deleted]
    return print(invalid_countrynames)


此函数将输入列表中的国家名称与pycountry.countries提供的以下各项进行比较:
alpha_2:两个字符的国家代码
alpha_3:三字符国家代码
name:国家名称
通用名称:国家的通用名称
官方名称:国家的正式名称
此外,由于我们输入的国家名称列表也是大写的,因此通过将上述每个属性内容转换为大写来进行比较。
这里需要注意的另一件事是,我在函数定义中创建了一个名为'tobe_deleted'的列表。这个列表包含了我们在pycountry中使用不同版本的名称的国家,因此我们不希望这些国家在调用函数时显示为无效的国家名称。
示例:
1.澳门也拼写为MACAO,因此两者都有效。但是,pycountry.countries只有一个拼写为MACAO.country_name_check()的条目可以处理MACAO和MACAU。
1.类似地,pycountry.countries有name ='Ireland'的爱尔兰条目。然而,它有时也被称为'Republic of Ireland'。country_name_check()可以处理输入数据集中的'Ireland'和'Republic of Ireland'。
我希望这个功能可以帮助所有在数据分析过程中可能遇到处理数据集中无效国家名称问题的人。感谢您阅读我的帖子,欢迎您提出任何建议和反馈以改进此功能。

tyky79it

tyky79it4#

您可以使用pycountry来获取所有国家的列表,还有许多其他选项,只需按照以下步骤操作:

pip install pycountry

import pycountry

def get_countries():
    for x in pycountry.countries:
        x.alpha_3 +'  --   '+x.name

它将打印带有国家名称的国家排序代码。
它有其他字段,您可以检查它

help(pycountry.countries)
euoag5mw

euoag5mw5#

你可以这样做:

import requests

req = requests.get('https://raw.githubusercontent.com/Miguel-Frazao/world-data/master/countries_data.json').json()
countries = (i['name'] for i in req)
print(list(countries))

您可以将它们保存到一个文件中,这样您就不必一直执行请求,或者只是复制并粘贴到代码中。
然后,要检查国家是否存在,您可以执行以下操作:

...
country = input('Insert a country')
if country not in countries:
    print('nice try, but invalid')
else:
    print('yooo, your country is {}'.format(country))

你有更多的数据,每个国家的情况下,你需要它,你可以检查它的链接,正在要求在代码

u4dcyp6a

u4dcyp6a6#

这是一个粗略的开始,使用从www.example.com收集的国家名称https://www.iso.org/obp/ui/#search。国家名称仍然包含一些棘手的情况。例如,这个代码识别“萨摩亚”,但它并没有真正“看到”“美属萨摩亚”。

class Countries:
    def __init__(self):
        self.__countries = ['afghanistan', 'aland islands', 'albania', 'algeria', 'american samoa', 'andorra', 'angola', 'anguilla', 'antarctica', 'antigua and barbuda', 'argentina', 'armenia', 'aruba', 'australia', 'austria', 'azerbaijan', 'bahamas (the)', 'bahrain', 'bangladesh', 'barbados', 'belarus', 'belgium', 'belize', 'benin', 'bermuda', 'bhutan', 'bolivia (plurinational state of)', 'bonaire, sint eustatius and saba', 'bosnia and herzegovina', 'botswana', 'bouvet island', 'brazil', 'british indian ocean territory (the)', 'brunei darussalam', 'bulgaria', 'burkina faso', 'burundi', 'cabo verde', 'cambodia', 'cameroon', 'canada', 'cayman islands (the)', 'central african republic (the)', 'chad', 'chile', 'china', 'christmas island', 'cocos (keeling) islands (the)', 'colombia', 'comoros (the)', 'congo (the democratic republic of the)', 'congo (the)', 'cook islands (the)', 'costa rica', "cote d'ivoire", 'croatia', 'cuba', 'curacao', 'cyprus', 'czechia', 'denmark', 'djibouti', 'dominica', 'dominican republic (the)', 'ecuador', 'egypt', 'el salvador', 'equatorial guinea', 'eritrea', 'estonia', 'ethiopia', 'falkland islands (the) [malvinas]', 'faroe islands (the)', 'fiji', 'finland', 'france', 'french guiana', 'french polynesia', 'french southern territories (the)', 'gabon', 'gambia (the)', 'georgia', 'germany', 'ghana', 'gibraltar', 'greece', 'greenland', 'grenada', 'guadeloupe', 'guam', 'guatemala', 'guernsey', 'guinea', 'guinea-bissau', 'guyana', 'haiti', 'heard island and mcdonald islands', 'holy see (the)', 'honduras', 'hong kong', 'hungary', 'iceland', 'india', 'indonesia', 'iran (islamic republic of)', 'iraq', 'ireland', 'isle of man', 'israel', 'italy', 'jamaica', 'japan', 'jersey', 'jordan', 'kazakhstan', 'kenya', 'kiribati', "korea (the democratic people's republic of)", 'korea (the republic of)', 'kuwait', 'kyrgyzstan', "lao people's democratic republic (the)", 'latvia', 'lebanon', 'lesotho', 'liberia', 'libya', 'liechtenstein', 'lithuania', 'luxembourg', 'macao', 'macedonia (the former yugoslav republic of)', 'madagascar', 'malawi', 'malaysia', 'maldives', 'mali', 'malta', 'marshall islands (the)', 'martinique', 'mauritania', 'mauritius', 'mayotte', 'mexico', 'micronesia (federated states of)', 'moldova (the republic of)', 'monaco', 'mongolia', 'montenegro', 'montserrat', 'morocco', 'mozambique', 'myanmar', 'namibia', 'nauru', 'nepal', 'netherlands (the)', 'new caledonia', 'new zealand', 'nicaragua', 'niger (the)', 'nigeria', 'niue', 'norfolk island', 'northern mariana islands (the)', 'norway', 'oman', 'pakistan', 'palau', 'palestine, state of', 'panama', 'papua new guinea', 'paraguay', 'peru', 'philippines (the)', 'pitcairn', 'poland', 'portugal', 'puerto rico', 'qatar', 'reunion', 'romania', 'russian federation (the)', 'rwanda', 'saint barthelemy', 'saint helena, ascension and tristan da cunha', 'saint kitts and nevis', 'saint lucia', 'saint martin (french part)', 'saint pierre and miquelon', 'saint vincent and the grenadines', 'samoa', 'san marino', 'sao tome and principe', 'saudi arabia', 'senegal', 'serbia', 'seychelles', 'sierra leone', 'singapore', 'sint maarten (dutch part)', 'slovakia', 'slovenia', 'solomon islands', 'somalia', 'south africa', 'south georgia and the south sandwich islands', 'south sudan', 'spain', 'sri lanka', 'sudan (the)', 'suriname', 'svalbard and jan mayen', 'swaziland', 'sweden', 'switzerland', 'syrian arab republic', 'taiwan (province of china)', 'tajikistan', 'tanzania, united republic of', 'thailand', 'timor-leste', 'togo', 'tokelau', 'tonga', 'trinidad and tobago', 'tunisia', 'turkey', 'turkmenistan', 'turks and caicos islands (the)', 'tuvalu', 'uganda', 'ukraine', 'united arab emirates (the)', 'united kingdom of great britain and northern ireland (the)', 'united states minor outlying islands (the)', 'united states of america (the)', 'uruguay', 'uzbekistan', 'vanuatu', 'venezuela (bolivarian republic of)', 'viet nam', 'virgin islands (british)', 'virgin islands (u.s.)', 'wallis and futuna', 'western sahara*', 'yemen', 'zambia', 'zimbabwe']

    def __call__(self, name, strict=3):
        result = False
        name = name.lower()
        if strict==3:
            for country in self.__countries:
                if country==name:
                    return True
            else:
                return result
        elif strict==2:
            for country in self.__countries:
                if name in country:
                    return True
            else:
                return result
        elif strict==1:
            for country in self.__countries:
                if country.startswith(name):
                    return True
            else:
                return result
        else:
            return result

countries = Countries()
print (countries('germany'))
print (countries('russia'))
print (countries('russia', strict=2))
print (countries('russia', strict=1))
print (countries('samoa', strict=2))
print (countries('samoa', strict=1))

结果如下:

True
False
True
True
True
True
3lxsmp7m

3lxsmp7m7#

老问题,但因为它出现在我的搜索和没有人提供这个替代我会添加它。
https://github.com/SteinRobert/python-restcountries是REST服务https://restcountries.eu/的Python Package 器。
Package 器似乎被维护(最近更新到python3),REST服务由apilayer维护,因此它应该是最新的。
pip install python-restcountries
from restcountries import RestCountryApiV2 as rapi def foo(name): country_list = rapi.get_countries_by_name('France')

2o7dmzc5

2o7dmzc58#

如果你需要检查一个给定的字符串是否是世界上的一个国家,以前的评论者建议使用pycountry。然而,pycountry以速度慢而闻名,并且只支持英语国家名称。要获得更高效的解决方案,您可能需要考虑使用countrywrangler,它使用性能优化的方法并支持34种语言的搜索,包括官方和常见的国家名称。
countrywrangler包括一个模糊搜索功能,它比pycountry的常规查找快,但仍然比它的正常搜索功能慢大约100倍。模糊搜索功能能够检测几乎所有国家,无论格式样式或拼写错误的变化。但是,对于大多数用例,countrywrangler的正常搜索功能就足够了。
下面是一个不使用模糊搜索功能检查给定字符串是否代表国家的示例用例:

import countrywrangler as cw

alpha2 = cw.Normalize.name_to_alpha2("Germany")
print(alpha2)

>>> DE

还有一个开启了模糊搜索:

import countrywrangler as cw

alpha2 = cw.Normalize.name_to_alpha2("Federal Republic of Germany", use_fuzzy=True)
print(alpha2)

>>> DE

countrywrangler无法找到给定字符串的匹配时,它会自动返回None。如果目标仅是确定给定字符串是否表示国家,则可以使用以下代码:

import countrywrangler as cw

if cw.Normalize.name_to_alpha2("Germany"):
   print(True)
else:
   print(False)

countrywrangler可以使用以下pip命令安装:

pip install countrywrangler

完整的文档可以在这里找到:https://countrywrangler.readthedocs.io/en/latest/normalize/country_name/

**披露:**我是CountryWrangler的作者。虽然pycountry主要是作为ISO标准的数据库而设计的,但countrywrangler是专门为规范国家数据而开发的。这两个库都满足各自的用例。

tgabmvqs

tgabmvqs9#

你可以使用pycountry来获取所有国家的列表:

pip install pycountry

你可以使用这个字典:

Country = [
    ('US', 'United States'),
    ('AF', 'Afghanistan'),
    ('AL', 'Albania'),
    ('DZ', 'Algeria'),
    ('AS', 'American Samoa'),
    ('AD', 'Andorra'),
    ('AO', 'Angola'),
    ('AI', 'Anguilla'),
    ('AQ', 'Antarctica'),
    ('AG', 'Antigua And Barbuda'),
    ('AR', 'Argentina'),
    ('AM', 'Armenia'),
    ('AW', 'Aruba'),
    ('AU', 'Australia'),
    ('AT', 'Austria'),
    ('AZ', 'Azerbaijan'),
    ('BS', 'Bahamas'),
    ('BH', 'Bahrain'),
    ('BD', 'Bangladesh'),
    ('BB', 'Barbados'),
    ('BY', 'Belarus'),
    ('BE', 'Belgium'),
    ('BZ', 'Belize'),
    ('BJ', 'Benin'),
    ('BM', 'Bermuda'),
    ('BT', 'Bhutan'),
    ('BO', 'Bolivia'),
    ('BA', 'Bosnia And Herzegowina'),
    ('BW', 'Botswana'),
    ('BV', 'Bouvet Island'),
    ('BR', 'Brazil'),
    ('BN', 'Brunei Darussalam'),
    ('BG', 'Bulgaria'),
    ('BF', 'Burkina Faso'),
    ('BI', 'Burundi'),
    ('KH', 'Cambodia'),
    ('CM', 'Cameroon'),
    ('CA', 'Canada'),
    ('CV', 'Cape Verde'),
    ('KY', 'Cayman Islands'),
    ('CF', 'Central African Rep'),
    ('TD', 'Chad'),
    ('CL', 'Chile'),
    ('CN', 'China'),
    ('CX', 'Christmas Island'),
    ('CC', 'Cocos Islands'),
    ('CO', 'Colombia'),
    ('KM', 'Comoros'),
    ('CG', 'Congo'),
    ('CK', 'Cook Islands'),
    ('CR', 'Costa Rica'),
    ('CI', 'Cote D`ivoire'),
    ('HR', 'Croatia'),
    ('CU', 'Cuba'),
    ('CY', 'Cyprus'),
    ('CZ', 'Czech Republic'),
    ('DK', 'Denmark'),
    ('DJ', 'Djibouti'),
    ('DM', 'Dominica'),
    ('DO', 'Dominican Republic'),
    ('TP', 'East Timor'),
    ('EC', 'Ecuador'),
    ('EG', 'Egypt'),
    ('SV', 'El Salvador'),
    ('GQ', 'Equatorial Guinea'),
    ('ER', 'Eritrea'),
    ('EE', 'Estonia'),
    ('ET', 'Ethiopia'),
    ('FK', 'Falkland Islands (Malvinas)'),
    ('FO', 'Faroe Islands'),
    ('FJ', 'Fiji'),
    ('FI', 'Finland'),
    ('FR', 'France'),
    ('GF', 'French Guiana'),
    ('PF', 'French Polynesia'),
    ('TF', 'French S. Territories'),
    ('GA', 'Gabon'),
    ('GM', 'Gambia'),
    ('GE', 'Georgia'),
    ('DE', 'Germany'),
    ('GH', 'Ghana'),
    ('GI', 'Gibraltar'),
    ('GR', 'Greece'),
    ('GL', 'Greenland'),
    ('GD', 'Grenada'),
    ('GP', 'Guadeloupe'),
    ('GU', 'Guam'),
    ('GT', 'Guatemala'),
    ('GN', 'Guinea'),
    ('GW', 'Guinea-bissau'),
    ('GY', 'Guyana'),
    ('HT', 'Haiti'),
    ('HN', 'Honduras'),
    ('HK', 'Hong Kong'),
    ('HU', 'Hungary'),
    ('IS', 'Iceland'),
    ('IN', 'India'),
    ('ID', 'Indonesia'),
    ('IR', 'Iran'),
    ('IQ', 'Iraq'),
    ('IE', 'Ireland'),
    ('IL', 'Israel'),
    ('IT', 'Italy'),
    ('JM', 'Jamaica'),
    ('JP', 'Japan'),
    ('JO', 'Jordan'),
    ('KZ', 'Kazakhstan'),
    ('KE', 'Kenya'),
    ('KI', 'Kiribati'),
    ('KP', 'Korea (North)'),
    ('KR', 'Korea (South)'),
    ('KW', 'Kuwait'),
    ('KG', 'Kyrgyzstan'),
    ('LA', 'Laos'),
    ('LV', 'Latvia'),
    ('LB', 'Lebanon'),
    ('LS', 'Lesotho'),
    ('LR', 'Liberia'),
    ('LY', 'Libya'),
    ('LI', 'Liechtenstein'),
    ('LT', 'Lithuania'),
    ('LU', 'Luxembourg'),
    ('MO', 'Macau'),
    ('MK', 'Macedonia'),
    ('MG', 'Madagascar'),
    ('MW', 'Malawi'),
    ('MY', 'Malaysia'),
    ('MV', 'Maldives'),
    ('ML', 'Mali'),
    ('MT', 'Malta'),
    ('MH', 'Marshall Islands'),
    ('MQ', 'Martinique'),
    ('MR', 'Mauritania'),
    ('MU', 'Mauritius'),
    ('YT', 'Mayotte'),
    ('MX', 'Mexico'),
    ('FM', 'Micronesia'),
    ('MD', 'Moldova'),
    ('MC', 'Monaco'),
    ('MN', 'Mongolia'),
    ('MS', 'Montserrat'),
    ('MA', 'Morocco'),
    ('MZ', 'Mozambique'),
    ('MM', 'Myanmar'),
    ('NA', 'Namibia'),
    ('NR', 'Nauru'),
    ('NP', 'Nepal'),
    ('NL', 'Netherlands'),
    ('AN', 'Netherlands Antilles'),
    ('NC', 'New Caledonia'),
    ('NZ', 'New Zealand'),
    ('NI', 'Nicaragua'),
    ('NE', 'Niger'),
    ('NG', 'Nigeria'),
    ('NU', 'Niue'),
    ('NF', 'Norfolk Island'),
    ('MP', 'Northern Mariana Islands'),
    ('NO', 'Norway'),
    ('OM', 'Oman'),
    ('PK', 'Pakistan'),
    ('PW', 'Palau'),
    ('PA', 'Panama'),
    ('PG', 'Papua New Guinea'),
    ('PY', 'Paraguay'),
    ('PE', 'Peru'),
    ('PH', 'Philippines'),
    ('PN', 'Pitcairn'),
    ('PL', 'Poland'),
    ('PT', 'Portugal'),
    ('PR', 'Puerto Rico'),
    ('QA', 'Qatar'),
    ('RE', 'Reunion'),
    ('RO', 'Romania'),
    ('RU', 'Russian Federation'),
    ('RW', 'Rwanda'),
    ('KN', 'Saint Kitts And Nevis'),
    ('LC', 'Saint Lucia'),
    ('VC', 'St Vincent/Grenadines'),
    ('WS', 'Samoa'),
    ('SM', 'San Marino'),
    ('ST', 'Sao Tome'),
    ('SA', 'Saudi Arabia'),
    ('SN', 'Senegal'),
    ('SC', 'Seychelles'),
    ('SL', 'Sierra Leone'),
    ('SG', 'Singapore'),
    ('SK', 'Slovakia'),
    ('SI', 'Slovenia'),
    ('SB', 'Solomon Islands'),
    ('SO', 'Somalia'),
    ('ZA', 'South Africa'),
    ('ES', 'Spain'),
    ('LK', 'Sri Lanka'),
    ('SH', 'St. Helena'),
    ('PM', 'St.Pierre'),
    ('SD', 'Sudan'),
    ('SR', 'Suriname'),
    ('SZ', 'Swaziland'),
    ('SE', 'Sweden'),
    ('CH', 'Switzerland'),
    ('SY', 'Syrian Arab Republic'),
    ('TW', 'Taiwan'),
    ('TJ', 'Tajikistan'),
    ('TZ', 'Tanzania'),
    ('TH', 'Thailand'),
    ('TG', 'Togo'),
    ('TK', 'Tokelau'),
    ('TO', 'Tonga'),
    ('TT', 'Trinidad And Tobago'),
    ('TN', 'Tunisia'),
    ('TR', 'Turkey'),
    ('TM', 'Turkmenistan'),
    ('TV', 'Tuvalu'),
    ('UG', 'Uganda'),
    ('UA', 'Ukraine'),
    ('AE', 'United Arab Emirates'),
    ('UK', 'United Kingdom'),
    ('UY', 'Uruguay'),
    ('UZ', 'Uzbekistan'),
    ('VU', 'Vanuatu'),
    ('VA', 'Vatican City State'),
    ('VE', 'Venezuela'),
    ('VN', 'Viet Nam'),
    ('VG', 'Virgin Islands (British)'),
    ('VI', 'Virgin Islands (U.S.)'),
    ('EH', 'Western Sahara'),
    ('YE', 'Yemen'),
    ('YU', 'Yugoslavia'),
    ('ZR', 'Zaire'),
    ('ZM', 'Zambia'),
    ('ZW', 'Zimbabwe')
]

2021年更新:该模块已更新,包括@JurajBezručka提到的缺点

相关问题