Ваш код для поиска названий стран выглядит просто отлично. Один совет при работе с файлами: используйте оператор with
- вместо open
и close
. При использовании open
, и возникает ошибка перед вызовом close
, возможно, файл неправильно закрыт, что может испортить все возможные вещи. with
закрывает файл независимо от того, что происходит внутри соответствующего блока кода (он работает аналогично try - finally
, для получения дополнительной информации см. Ссылку выше). Итак, вот так:
with open('NameList.txt', 'r') as fw:
for line_fw in fw:
...
гарантируется, что файл всегда будет закрыт. Кстати, вместо использования line.find('+')
, вы можете просто использовать line.split('+')
, который убирает всю часть среза строки.
Теперь к вашему вопросу: здесь есть несколько возможностей. Самым простым будет определение списка для каждой страны и добавление соответствующих имен в правильный список:
de = []
hu = []
uk = []
sk = []
with open('NameList.txt', 'r') as fw:
for line_fw in fw:
if not line_fw.strip():
continue
country = line_fw.split('+')[1].split('-')[0].strip()
nickname = line_fw.split('+')[0]
if country == 'DE':
de.append(nickname)
elif country == 'HU':
hu.append(nickname)
elif country == 'UK':
uk.append(nickname)
else:
sk.append(nickname)
это вернет список для каждой страны, содержащий соответствующие псевдонимы. Как видите, это очень неуклюже и долго. Более элегантное решение - использование словаря со странами в качестве ключей и списка имен в качестве значений:
d = {}
with open('NameList.txt', 'r') as fw:
for line_fw in fw:
if not line_fw.strip():
continue
country = line_fw.split('+')[1].split('-')[0].strip()
nickname = line_fw.split('+')[0].strip()
try:
d[country].append(nickname) # if country already exists in d, append the nickname
except KeyError:
d[country] = [nickname] # if country doesn't exist in d, make a new entry
, который создаст словарь, похожий на этот (я только взял первые несколько строк, чтобы проиллюстрировать это):
{'HU': ['FODORGBR', 'ZSOLDPTE'], 'DE': ['THAUSKTR'], 'UK': ['WRIGHNIL']}
Теперь, есть более элегантные решения для извлечения стран и псевдонимов, но некоторые из них были указаны в других ответах.
Наконец, если я правильно понял, вы хотите записать свои результаты в новый файл или хотя бы распечатать их. Допустим, у вас есть словарь вышеуказанной формы. Просто переберите его ключи с помощью for k in d:
, добавьте несколько новых строк ('\n'
) между ними и используйте join
, чтобы преобразовать списки в одну строку с символами новой строки между всеми элементами:
for k in d:
print(k + ':\n' + '\n'.join(d[k]) + '\n')
который напечатает:
HU:
FODORGBR
ZSOLDPTE
DE:
THAUSKTR
UK:
WRIGHNIL
добавив with open(outputfile, 'w') as f:
и заменив print
на f.write
, вы можете легко записать это в новый файл.