@mr_Try

Как записать все «правильные» данные и исключения в логи в Python 3?

В общем, суть такая:
Есть файл с протоколом регистраций пользователей на сайте (registrations.txt).
Каждая строка содержит информацию о имени, электронной почте и возрасте человека.
Надо проверить данные из файла, для каждой строки и в результате проверки нужно сформировать два файла:
  • registrations_good.log для правильных данных, записывать строки как есть
  • registrations_bad.log для ошибочных, записывать строку и вид ошибки.


Все исключения я поймал, но проблема в том, что я понятия не имею, как записать всю информацию в лог файлы

class NotNameError(Exception):
    
    def __init__(self, message, input_data = None):
        self.message = message
        self.input_data = input_data
        
    def __str__(self):
        return self.message
        
class NotEmailError(Exception):
    
    def __init__(self, message, input_data = None):
        self.message = message
        self.input_data = input_data
        
    def __str__(self):
        return self.message

def read_line(line):
    print(f'{line}')
    name, mail, age = line.split(' ')
    age = int(age)
    try:
        if age < 10 or age > 99:
            raise ValueError 
    except ValueError:
        print(f"Недопустимое значение возраста {ValueError}")
    try:
        if name.isalpha() == False:
            raise NotNameError('Ошибка имени')
    except NotNameError:
        print(f"Недопустимое значение имени {NotNameError}")      
    try:
        if '@' not in mail:
            raise NotEmailError('Ошибка электронной почты')
        elif '.' not in mail:
            raise NotEmailError('Ошибка электронной почты')
    except NotEmailError:
        print(f"Недопустимое значение для электронной почты {NotEmailError}")  
    return name, mail, age
    
text = open('registrations_.txt', 'r', encoding="utf-8")
for line in text:
    try:
        line_in_text = read_line(line)
    except ValueError as val_exc:
        if 'unpack' in val_exc.args[0]:
            print(f'Пропущено одно или несколько значений {val_exc}')
        else:
            print(f'Ошибка значения {val_exc}')
text.close()


Подскажите, пожалуйста, как записать нужные логи?
  • Вопрос задан
  • 943 просмотра
Решения вопроса 1
MinTnt
@MinTnt
class NotNameError(Exception):
    
    def __init__(self, message, input_data = None):
        self.message = message
        self.input_data = input_data
        
    def __str__(self):
        return self.message
        
class NotEmailError(Exception):
    
    def __init__(self, message, input_data = None):
        self.message = message
        self.input_data = input_data
        
    def __str__(self):
        return self.message

def read_line(line):
    print(f'{line}')
    split_text = line.split(' ', 2)
    if len(split_text) == 3:
    	name, mail, age = split_text
    else:
        raise ValueError('Пропущено одно или несколько значений')
    try: age = int(age) 
    except ValueError: raise ValueError('Ошибка в значении возраста')
    if age < 10 or age > 99:
            raise ValueError('Недопустимое значение возраста')
    if name.isalpha() == False:
        raise NotNameError('Ошибка имени (Недопустимое значение имени)')
    if '@' not in mail or '.' not in mail:
        raise NotEmailError('Ошибка электронной почты (Недопустимое значение для электронной почты)')

    return True


good_acc = []
bad_acc = []
text = open('registrations_.txt', 'r', encoding="utf-8")
for line in text.read().splitlines():
    try:
        if read_line(line):
        	good_acc.append(line)
    except Exception as error:
        bad_acc.append(f'{line} | {error}')

with open('registrations_good.log', 'w', encoding='utf-8') as f:
	f.write('\n'.join(good_acc))
with open('registrations_bad.log', 'w', encoding='utf-8') as f:
	f.write('\n'.join(bad_acc))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы