Проверить данные из файла, для каждой строки питон
Может кто-нибудь и подскажет, дан файл txt. 10000 строк. В строке содержится информация об имени, электронной почте и возрасте человека. Нужно проверить данные из файла, для каждой строки:
- Присутствуют все три поля,
- поле имени содержит только буквы,
- поле email содержит
@и., - поле возраст является числом от 10 до 99.
Пример файла:
Ли [email protected] 58 Волочкова [email protected] 9 Ольга [email protected] 58 Чонгкун [email protected] 84 iflyyvp.ru 73 Чонгкун [email protected] Ярослав42 [email protected] 74 Ли 25 Dgiga mwwtk.mail.ru 95 Тролль65 [email protected] 31 Ольга [email protected] 99 Яочуан [email protected] 100 snaper [email protected] 16 Зефир [email protected] 7 Хенг [email protected] 108 Халк [email protected]
и тд.......
Я в начале сделала: каждую строку вогнала в список(код прикрепляю):
with open('registrations.txt', 'r', encoding='utf-8') as fh:
for line in fh:
print( line.strip().split())
['Джигурда', '[email protected]', '14'] ['Ли' , '[email protected]' , '58'] ['Волочкова' , '[email protected]' , '9'] ['Ли' , '25']
и тд.....
Но дальше не могу понять, как прогонять данные? Понимаю, что можно сделать через классы? Но как? Не могу сориентироваться
Ответы (2 шт):
Весь смысл этого кода в том, что каждая строка проверяется регулярным выражением, и если re.match возвращает None т.е. не находит совпадение то функция возвращает False
import re
file = 'Ли [email protected] 58\nВолочкова [email protected] 49\nОльга [email protected] 58'
pattern = '\s*[a-zA-Zа-яА-Я]+\s+[\w\.-]+@[\w\.-]+(?:\.[\w]+)+\s+[1-9][0-9]\s*$'
def is_valid(file):
for line in file.splitlines():
if not re.match(pattern, line): return False
return True
print(is_valid(file))
100% будет работать вот на такой простыне. В качестве приятного бонуса, код сформирует два .txt файла с логами, где будут плохие и хорошие строки:)
class NotNameError(Exception):
pass
class NotEmailError(Exception):
pass
def check(line):
name, mail, age = line.split(' ')
symbols = ('@', '.')
age = int(age)
if name.isalpha() is False:
raise NotNameError
elif age not in range(10,100):
raise ValueError()
else:
for char in symbols:
if char not in mail:
raise NotEmailError
return line
with open('registrations_.txt', mode='r', encoding='utf-8') as ff:
for line in ff:
line = line[:-1]
try:
string = check(line)
except NotNameError:
bad = open ('registration_bad.log', mode='a', encoding='utf-8')
bad.write(line + 'Имя содержит цифры' + '\n')
bad.close()
except NotEmailError:
bad = open ('registration_bad.log', mode='a', encoding='utf-8')
bad.write(line + 'Некорректно указан E-mail' + '\n')
bad.close()
except ValueError:
bad = open ('registration_bad.log', mode='a', encoding='utf-8')
bad.write(line + 'Неверные данные' + '\n')
bad.close()
else:
good = open('registraton_good.log', mode='a', encoding='utf-8')
good.write(line + '\n')
good.close()
ff.close()