127 lines
5.2 KiB
Python
127 lines
5.2 KiB
Python
import os
|
||
import json
|
||
import sys
|
||
|
||
def delete_duplicates(json_file="contacts_copy.json"):
|
||
"""
|
||
Удаляет дубликаты файлов, оставляя только первый файл в каждой группе
|
||
"""
|
||
print("Удаление дубликатов файлов")
|
||
print("=" * 50)
|
||
|
||
# Проверяем существование JSON файла
|
||
if not os.path.exists(json_file):
|
||
print(f"Ошибка: Файл {json_file} не найден!")
|
||
print("Сначала запустите скрипт для создания contacts_copy.json")
|
||
return
|
||
|
||
try:
|
||
# Читаем JSON файл
|
||
with open(json_file, 'r', encoding='utf-8') as f:
|
||
groups = json.load(f)
|
||
except json.JSONDecodeError:
|
||
print(f"Ошибка: Файл {json_file} содержит некорректный JSON!")
|
||
return
|
||
except Exception as e:
|
||
print(f"Ошибка при чтении файла {json_file}: {e}")
|
||
return
|
||
|
||
if not isinstance(groups, list):
|
||
print(f"Ошибка: {json_file} должен содержать список групп!")
|
||
return
|
||
|
||
# Статистика
|
||
total_groups = len(groups)
|
||
total_files_before = sum(len(group) for group in groups)
|
||
files_to_keep = 0
|
||
files_to_delete = 0
|
||
deleted_files = []
|
||
kept_files = []
|
||
|
||
print(f"Загружено групп из {json_file}: {total_groups}")
|
||
print(f"Всего файлов в группах: {total_files_before}")
|
||
print("-" * 50)
|
||
|
||
# Обрабатываем каждую группу
|
||
for i, group in enumerate(groups, 1):
|
||
if not isinstance(group, list):
|
||
print(f"Предупреждение: Группа {i} не является списком, пропускаем")
|
||
continue
|
||
|
||
if len(group) == 0:
|
||
continue # Пропускаем пустые группы
|
||
|
||
# Оставляем первый файл, остальные помечаем на удаление
|
||
file_to_keep = group[0]
|
||
files_to_delete_in_group = group[1:]
|
||
|
||
# Добавляем файлы в соответствующие списки
|
||
kept_files.append(file_to_keep)
|
||
files_to_keep += 1
|
||
|
||
# Удаляем файлы из группы (кроме первого)
|
||
for file_to_delete in files_to_delete_in_group:
|
||
# Проверяем существование файла
|
||
if os.path.exists(file_to_delete):
|
||
try:
|
||
os.remove(file_to_delete)
|
||
deleted_files.append(file_to_delete)
|
||
files_to_delete += 1
|
||
print(f"✓ Удален: {file_to_delete}")
|
||
except Exception as e:
|
||
print(f"✗ Ошибка при удалении {file_to_delete}: {e}")
|
||
else:
|
||
print(f"✗ Файл не найден (уже удален?): {file_to_delete}")
|
||
|
||
# Выводим итоговую статистику
|
||
print("=" * 50)
|
||
print("ИТОГИ УДАЛЕНИЯ:")
|
||
print(f"Обработано групп: {total_groups}")
|
||
print(f"Всего файлов было: {total_files_before}")
|
||
print(f"Файлов сохранено: {files_to_keep}")
|
||
print(f"Файлов удалено: {files_to_delete}")
|
||
|
||
if files_to_delete > 0:
|
||
print(f"\nСохраненные файлы ({len(kept_files)}):")
|
||
for file in sorted(kept_files):
|
||
print(f" {file}")
|
||
|
||
print(f"\nУдаленные файлы ({len(deleted_files)}):")
|
||
for file in sorted(deleted_files):
|
||
print(f" {file}")
|
||
|
||
# Сохраняем список удаленных файлов в файл
|
||
with open("deleted_files.log", 'w', encoding='utf-8') as f:
|
||
f.write("Удаленные файлы:\n")
|
||
f.write("=" * 50 + "\n")
|
||
for file in sorted(deleted_files):
|
||
f.write(f"{file}\n")
|
||
f.write(f"\nВсего удалено: {len(deleted_files)} файлов\n")
|
||
|
||
print(f"\nСписок удаленных файлов сохранен в deleted_files.log")
|
||
else:
|
||
print("\nДубликатов для удаления не найдено!")
|
||
|
||
print("=" * 50)
|
||
|
||
def main():
|
||
# Можно указать другой файл через аргумент командной строки
|
||
json_file = "contacts_copy.json"
|
||
|
||
if len(sys.argv) > 1:
|
||
json_file = sys.argv[1]
|
||
|
||
# Подтверждение удаления
|
||
print("ВНИМАНИЕ: Этот скрипт удалит файлы с вашего диска!")
|
||
print("Убедитесь, что у вас есть резервная копия важных данных.")
|
||
print("-" * 50)
|
||
|
||
response = input("Продолжить удаление? (y/n): ").strip().lower()
|
||
|
||
if response == 'y' or response == 'yes' or response == 'да':
|
||
delete_duplicates(json_file)
|
||
else:
|
||
print("Удаление отменено.")
|
||
|
||
if __name__ == "__main__":
|
||
main() |