Skip to content

Instantly share code, notes, and snippets.

@mpgxc
Created April 28, 2024 17:05
Show Gist options
  • Save mpgxc/3b662fd240222e2bc18ee75a346a5091 to your computer and use it in GitHub Desktop.
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).
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