forked from proffix4/QRCodeAnalyzer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcheck_duplicates.py
125 lines (104 loc) · 5.52 KB
/
check_duplicates.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import csv
import logging
import subprocess
import os
from datetime import datetime, timedelta
from pathlib import Path
from PyQt5.QtWidgets import QApplication, QMessageBox
import sys
filename_log="duplicates_log.txt"
# Настройка логирования
logging.basicConfig(
filename=filename_log,
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
encoding="utf-8"
)
# Очистка лог-файла перед началом работы
with open(filename_log, 'w', encoding='utf-8') as log_file:
pass # Открытие файла в режиме 'w' очищает его
# Функция для отображения всплывающего окна
def show_popup(message, title="Предупреждение", buttons=QMessageBox.Ok):
app = QApplication([]) # Создание приложения
msg = QMessageBox() # Создание окна сообщения
msg.setIcon(QMessageBox.Warning)
msg.setWindowTitle(title)
msg.setText(message)
msg.setStandardButtons(buttons)
return msg.exec_()
# Функция для проверки повторных отметок
def check_duplicates(csv_file, duplicates_found):
logging.info(f"Проверка файла: {csv_file}")
attendance_records = {}
try:
with open(csv_file, mode="r", encoding="utf-8") as file:
reader = csv.DictReader(file)
# Проверка наличия нужных столбцов
expected_columns = {"text", "date_utc", "time_utc"}
if not expected_columns.issubset(reader.fieldnames):
logging.error(f"Файл {csv_file} не содержит все необходимые столбцы ({expected_columns}).")
return duplicates_found
for row in reader:
name = row.get("text", "").strip()
date_utc = row.get("date_utc", "").strip()
time_utc = row.get("time_utc", "").strip()
# Проверка на пустые строки
if not name or not date_utc or not time_utc:
logging.warning(f"Пропущенные данные в файле {csv_file}: {row}")
continue
# Объединяем дату и время в один объект datetime
try:
timestamp = datetime.strptime(f"{date_utc} {time_utc}", "%Y-%m-%d %H:%M:%S")
except ValueError:
logging.error(f"Ошибка в формате даты/времени в файле {csv_file}: {row}")
continue
if name in attendance_records:
last_timestamp, last_row = attendance_records[name]
if timestamp - last_timestamp < timedelta(minutes=5):
logging.warning(
f"Дубликат в файле {csv_file}: {name} ({date_utc} {time_utc}). "
f"Предыдущая отметка: {last_row['date_utc']} {last_row['time_utc']}"
)
duplicates_found = True
else:
attendance_records[name] = (timestamp, row)
else:
attendance_records[name] = (timestamp, row)
return duplicates_found
except Exception as e:
logging.error(f"Ошибка при обработке файла {csv_file}: {e}")
return duplicates_found
# Основная функция для обработки всех файлов в папке Data
def process_data_folder():
data_folder = Path("Data")
duplicates_found = False # Флаг для отслеживания наличия дубликатов
if not data_folder.exists():
logging.error(f"Папка '{data_folder}' не найдена.")
return
csv_files = list(data_folder.glob("*.csv"))
if not csv_files:
logging.info("В папке 'Data' нет файлов CSV для обработки.")
return
for csv_file in csv_files:
duplicates_found = check_duplicates(csv_file, duplicates_found)
if duplicates_found:
user_response = show_popup(f"Дубликаты были найдены в процессе обработки файлов. Хотите открыть лог-файл?",
title="Предупреждение",
buttons=QMessageBox.Yes | QMessageBox.No)
if user_response == QMessageBox.Yes:
# Открытие лог-файла для Windows, Linux и macOS
try:
if sys.platform == "win32":
# Используем os.startfile для Windows
os.startfile(filename_log)
elif sys.platform == "linux" or sys.platform == "darwin": # Для Linux и macOS
subprocess.run(["xdg-open", filename_log], check=True) # Для Linux
else:
logging.error(f"Неизвестная операционная система: {sys.platform}")
except Exception as e:
logging.error(f"Ошибка при открытии лог-файла: {e}")
show_popup("Не удалось открыть лог-файл.")
else:
logging.info("Повторных отметок не обнаружено в обработанных файлах.")
if __name__ == "__main__":
process_data_folder()