diff --git a/data.csv b/data.csv new file mode 100644 index 0000000..60c31e2 --- /dev/null +++ b/data.csv @@ -0,0 +1,4 @@ +Изготовитель системы,Название ОС,Код продукта,Тип системы +LENOVO,Microsoft Windows 7 Профессиональная,00971-OEM-1982661-00231,x64-based PC +ACER,Microsoft Windows 10 Professional,00971-OEM-1982661-00231,x64-based PC +DELL,Microsoft Windows 8.1 Professional,00971-OEM-1982661-00231,x86-based PC diff --git a/exercise_1.py b/exercise_1.py new file mode 100644 index 0000000..36efa72 --- /dev/null +++ b/exercise_1.py @@ -0,0 +1,65 @@ +""" +1. Задание на закрепление знаний по модулю CSV. Написать скрипт, осуществляющий выборку определенных данных из файлов +info_1.txt, info_2.txt, info_3.txt и формирующий новый «отчетный» файл в формате CSV. Для этого: +Создать функцию get_data(), в которой в цикле осуществляется перебор файлов с данными, их открытие и считывание данных. +В этой функции из считанных данных необходимо с помощью регулярных выражений извлечь значения параметров +«Изготовитель системы», «Название ОС», «Код продукта», «Тип системы». +Значения каждого параметра поместить в соответствующий список. Должно получиться четыре списка — например, +os_prod_list, os_name_list, os_code_list, os_type_list. +В этой же функции создать главный список для хранения данных отчета — например, main_data — и поместить в него +названия столбцов отчета в виде списка: «Изготовитель системы», «Название ОС», «Код продукта», «Тип системы». +Значения для этих столбцов также оформить в виде списка и поместить в файл main_data (также для каждого файла); +Создать функцию write_to_csv(), в которую передавать ссылку на CSV-файл. +В этой функции реализовать получение данных через вызов функции get_data(), а также сохранение +подготовленных данных в соответствующий CSV-файл; Проверить работу программы через вызов функции write_to_csv(). +""" + +import csv +import re + +import chardet + + +def get_data(files_l): + main_data = ['Изготовитель системы', 'Название ОС', 'Код продукта', 'Тип системы'] + os_prod_list = [] + os_name_list = [] + os_code_list = [] + os_type_list = [] + data = [] + for file in files_l: + with open(file, 'rb') as f: + data_b = f.read() + encoding = chardet.detect(data_b)['encoding'] + with open(file, encoding=encoding) as f: + pattern_1 = re.compile(r'Изготовитель системы:\s*\S*') + pattern_2 = re.compile(r'Название ОС:\s*\S*') + pattern_3 = re.compile(r'Код продукта:\s*\S*') + pattern_4 = re.compile(r'Тип системы:\s*\S*') + for line in f: + if re.match(pattern_1, line) is not None: + os_prod_list.append(line.split(':')[1].strip()) + if re.match(pattern_2, line) is not None: + os_name_list.append(line.split(':')[1].strip()) + if re.match(pattern_3, line) is not None: + os_code_list.append(line.split(':')[1].strip()) + if re.match(pattern_4, line) is not None: + os_type_list.append(line.split(':')[1].strip()) + rows = [os_prod_list, os_name_list, os_code_list, os_type_list] + data.append(main_data) + for i in range(len(rows[0])): + line = [row[i] for row in rows] + data.append(line) + return data + + +def write_to_csv(file): + with open(file, mode="w", encoding='utf-8') as f: + writer = csv.writer(f) + for row in get_data(files_list): + writer.writerow(row) + + +if __name__ == '__main__': + files_list = ['info_1.txt', 'info_2.txt', 'info_3.txt'] + write_to_csv('data.csv') diff --git a/exercise_2.py b/exercise_2.py new file mode 100644 index 0000000..b05d2ab --- /dev/null +++ b/exercise_2.py @@ -0,0 +1,30 @@ +""" +2. Задание на закрепление знаний по модулю json. Есть файл orders в формате JSON с информацией о заказах. +Написать скрипт, автоматизирующий его заполнение данными. Для этого: +Создать функцию write_order_to_json(), в которую передается 5 параметров — товар (item), количество (quantity), +цена (price), покупатель (buyer), дата (date). +Функция должна предусматривать запись данных в виде словаря в файл orders.json. +При записи данных указать величину отступа в 4 пробельных символа; +Проверить работу программы через вызов функции write_order_to_json() с передачей в нее значений каждого параметра. +""" +import json + + +def write_order_to_json(item, quantity, price, buyer, date): + with open('orders.json', 'r', encoding='utf-8') as f: + orders = json.load(f) + with open('orders.json', 'w', encoding='utf-8') as f: + orders['orders'].append({ + "item": item, + "quantity": quantity, + "price": price, + "buyer": buyer, + "date": date + }) + json.dump(orders, f, indent=4, ensure_ascii=False) + + +if __name__ == '__main__': + write_order_to_json('Стол', 2, 1000, 'Вася', '2020-01-01') + write_order_to_json('Стул', 1, 500, 'Петя', '2020-01-02') + write_order_to_json('Кресло', 3, 1500, 'Коля', '2020-01-03') diff --git a/exercise_3.py b/exercise_3.py new file mode 100644 index 0000000..699b31a --- /dev/null +++ b/exercise_3.py @@ -0,0 +1,33 @@ +""" +3. Задание на закрепление знаний по модулю yaml. Написать скрипт, автоматизирующий сохранение данных +в файле YAML-формата. Для этого: +Подготовить данные для записи в виде словаря, в котором первому ключу соответствует список, второму — целое число, +третьему — вложенный словарь, где значение каждого ключа — это целое число с юникод-символом, +отсутствующим в кодировке ASCII (например, €); +Реализовать сохранение данных в файл формата YAML — например, в файл file.yaml. +При этом обеспечить стилизацию файла с помощью параметра default_flow_style, а также установить +возможность работы с юникодом: allow_unicode = True; +Реализовать считывание данных из созданного файла и проверить, совпадают ли они с исходными. +""" + +import yaml + + +def save_yaml(var): + with open('file.yaml', 'w', encoding='utf-8') as f: + yaml.dump(var, f, default_flow_style=False, allow_unicode=True, sort_keys=False) + + +def read_yaml(file): + with open(file, 'r', encoding='utf-8') as f: + return yaml.load(f, Loader=yaml.SafeLoader) + + +if __name__ == '__main__': + data = {'Имена': ['Вася', 'Петя', 'Зина'], + 'Количество': 3, + 'Заначка': {'Вася': '1000$', 'Петя': '500€', 'Зина': '10000₽'}} + save_yaml(data) + out = read_yaml('file.yaml') + if data == out: + print('Данные совпадают') diff --git a/file.yaml b/file.yaml new file mode 100644 index 0000000..ee593b2 --- /dev/null +++ b/file.yaml @@ -0,0 +1,9 @@ +Имена: +- Вася +- Петя +- Зина +Количество: 3 +Заначка: + Вася: 1000$ + Петя: 500€ + Зина: 10000₽ diff --git a/info_1.txt b/info_1.txt new file mode 100644 index 0000000..845390d --- /dev/null +++ b/info_1.txt @@ -0,0 +1,42 @@ + : Comp1 + : Microsoft Windows 7 + : 6.1.7601 Service Pack 1 7601 + : Microsoft Corporation + : + : Multiprocessor Free + : User + : + : 00971-OEM-1982661-00231 + : 11.10.2013, 10:18:05 + : 0 ., 4 ., 41 , 0 . + : LENOVO + : 3538F2G + : x64-based PC +(): - 1. + [01]: Intel64 Family 6 Model 42 Stepping 7 GenuineIntel ~3400 + BIOS: LENOVO - 1390 + Windows: C:\Windows + : C:\Windows\system32 + : \Device\HarddiskVolume1 + : ru; + : en-us; () + : (UTC+04:00) , , - + : 3 914 + : 2 299 + : . : 7 826 + : : 6 139 + : : 1 687 + : / +: net + : / +(): - 74. + [01]: KB982861 + [02]: 982861 +. . . + [74]: KB982018 + : - 1. + [01]: Realtek PCIe GBE Family Controller + : + DHCP : + IP- + [01]: 192.168.0.4 \ No newline at end of file diff --git a/info_2.txt b/info_2.txt new file mode 100644 index 0000000..0f96fb2 --- /dev/null +++ b/info_2.txt @@ -0,0 +1,42 @@ + : Comp1 + : Microsoft Windows 10 Professional + : 16299 + : Microsoft Corporation + : + : Multiprocessor Free + : User + : + : 00971-OEM-1982661-00231 + : 11.10.2013, 10:18:05 + : 0 ., 4 ., 41 , 0 . + : ACER + : 3538F2G + : x64-based PC +(): - 1. + [01]: Intel64 Family 6 Model 42 Stepping 7 GenuineIntel ~3400 + BIOS: LENOVO - 1390 + Windows: C:\Windows + : C:\Windows\system32 + : \Device\HarddiskVolume1 + : ru; + : en-us; () + : (UTC+04:00) , , - + : 3 914 + : 2 299 + : . : 7 826 + : : 6 139 + : : 1 687 + : / +: net + : / +(): - 74. + [01]: KB982861 + [02]: 982861 +. . . + [74]: KB982018 + : - 1. + [01]: Realtek PCIe GBE Family Controller + : + DHCP : + IP- + [01]: 192.168.0.4 \ No newline at end of file diff --git a/info_3.txt b/info_3.txt new file mode 100644 index 0000000..c2a964a --- /dev/null +++ b/info_3.txt @@ -0,0 +1,42 @@ + : Comp1 + : Microsoft Windows 8.1 Professional + : 10001 + : Microsoft Corporation + : + : Multiprocessor Free + : User + : + : 00971-OEM-1982661-00231 + : 11.10.2013, 10:18:05 + : 0 ., 4 ., 41 , 0 . + : DELL + : 3538F2G + : x86-based PC +(): - 1. + [01]: Intel64 Family 6 Model 42 Stepping 7 GenuineIntel ~3400 + BIOS: LENOVO - 1390 + Windows: C:\Windows + : C:\Windows\system32 + : \Device\HarddiskVolume1 + : ru; + : en-us; () + : (UTC+04:00) , , - + : 3 914 + : 2 299 + : . : 7 826 + : : 6 139 + : : 1 687 + : / +: net + : / +(): - 74. + [01]: KB982861 + [02]: 982861 +. . . + [74]: KB982018 + : - 1. + [01]: Realtek PCIe GBE Family Controller + : + DHCP : + IP- + [01]: 192.168.0.4 \ No newline at end of file diff --git a/orders.json b/orders.json new file mode 100644 index 0000000..ec6a64f --- /dev/null +++ b/orders.json @@ -0,0 +1,25 @@ +{ + "orders": [ + { + "item": "Стол", + "quantity": 2, + "price": 1000, + "buyer": "Вася", + "date": "2020-01-01" + }, + { + "item": "Стул", + "quantity": 1, + "price": 500, + "buyer": "Петя", + "date": "2020-01-02" + }, + { + "item": "Кресло", + "quantity": 3, + "price": 1500, + "buyer": "Коля", + "date": "2020-01-03" + } + ] +} \ No newline at end of file