Created
April 28, 2024 17:05
-
-
Save mpgxc/3b662fd240222e2bc18ee75a346a5091 to your computer and use it in GitHub Desktop.
Gerencia o processo de mover arquivos de uma pasta de origem para uma pasta de destino, organizando-os em subpastas baseadas no ano de criação e tipo de arquivo (fotos ou vídeos).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import shutil | |
from datetime import datetime | |
from PIL import Image | |
from tqdm import tqdm | |
class FileManager: | |
""" | |
Gerencia o processo de mover arquivos de uma pasta de origem para uma pasta de destino, | |
organizando-os em subpastas baseadas no ano de criação e tipo de arquivo (fotos ou vídeos). | |
""" | |
def __init__(self, source_folder, destination_folder): | |
""" | |
Inicializa o FileManager com as pastas de origem e destino. | |
:param source_folder: Caminho da pasta de origem dos arquivos. | |
:param destination_folder: Caminho da pasta de destino onde os arquivos serão organizados. | |
""" | |
self.source_folder = source_folder | |
self.destination_folder = destination_folder | |
self.photo_extensions = [ | |
".jpg", | |
".jpeg", | |
".png", | |
".gif", | |
".tiff", | |
".bmp", | |
".webp", | |
".dng", | |
] | |
self.video_extensions = [ | |
".mp4", | |
".mov", | |
".wmv", | |
".flv", | |
".avi", | |
".avchd", | |
".mkv", | |
".webm", | |
] | |
def process_files(self): | |
files = os.listdir(self.source_folder) | |
for file in tqdm(files, desc="Processing files"): | |
self.process_file(file) | |
def process_file(self, file): | |
file_path = os.path.join(self.source_folder, file) | |
if not os.path.isfile(file_path): | |
return | |
subfolder = self.get_subfolder(file) | |
if not subfolder: | |
return | |
date_str = self.get_file_date(file_path) | |
year = self.extract_year(date_str, file_path) | |
self.move_file(file_path, year, subfolder) | |
def get_subfolder(self, file): | |
extension = os.path.splitext(file)[1].lower() | |
if extension in self.photo_extensions: | |
return "photos" | |
elif extension in self.video_extensions: | |
return "videos" | |
return None | |
def get_file_date(self, file_path): | |
try: | |
with Image.open(file_path) as img: | |
exif_data = img._getexif() | |
return exif_data[36867] if exif_data and 36867 in exif_data else None | |
except Exception: | |
return None | |
def extract_year(self, date_str, file_path): | |
if date_str: | |
file_date = datetime.strptime(date_str, "%Y:%m:%d %H:%M:%S") | |
return str(file_date.year) | |
else: | |
modification_date = datetime.fromtimestamp(os.path.getmtime(file_path)) | |
return modification_date.strftime("%Y") | |
def move_file(self, file_path, year, subfolder): | |
year_folder = os.path.join(self.destination_folder, year) | |
final_folder = os.path.join(year_folder, subfolder) | |
if not os.path.exists(final_folder): | |
os.makedirs(final_folder) | |
shutil.move(file_path, os.path.join(final_folder, os.path.basename(file_path))) | |
if __name__ == "__main__": | |
folder = "photos" | |
source_folder = f"ORIGEM/{folder}" | |
destination_folder = "DESTINO" | |
file_manager = FileManager(source_folder, destination_folder) | |
file_manager.process_files() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment