import pandas as pd import secrets # Plus sécurisé que 'random' pour les mots de passe import string def generate_robust_password(length=12): """ Génère un mot de passe fort de 12 caractères. - Utilise le module 'secrets' (cryptographiquement sûr). - Exclut les caractères ambigus (I, l, 1, O, 0) pour éviter les erreurs de lecture. - Garantit au moins 1 Maj, 1 Min, 1 Chiffre, 1 Spécial. """ # 1. Définition des caractères (sans les ambigus) # On retire I, l, O du jeu de lettres letters = string.ascii_letters.replace('I', '').replace('l', '').replace('O', '') # On retire 1 et 0 du jeu de chiffres digits = string.digits.replace('1', '').replace('0', '') special = "!@#$%&*+-=?" # Liste de symboles sûrs pour AD alphabet = letters + digits + special while True: # On pioche aléatoirement password = ''.join(secrets.choice(alphabet) for _ in range(length)) # On vérifie si les conditions de complexité sont remplies if (any(c.islower() for c in password) and any(c.isupper() for c in password) and any(c in digits for c in password) and any(c in special for c in password)): return password def main(): # --- CONFIGURATION --- input_file = "Projet 01 - happy_koalas_employees.csv" output_file = "happy_koalas_employees_with_passwords.csv" # --------------------- try: print(f"--- Début du traitement ---") print(f"Lecture de : {input_file}") # Lecture du CSV (gestion des séparateurs) df = pd.read_csv(input_file, sep=";") # Nettoyage des colonnes vides (fréquent avec les conversions Excel) df = df.dropna(axis=1, how='all') print("Génération des mots de passe sécurisés...") # Application de la fonction df['Password'] = df.apply(lambda x: generate_robust_password(), axis=1) # Sauvegarde df.to_csv(output_file, sep=';', index=False) print(f"✅ SUCCÈS : Fichier sauvegardé sous '{output_file}'") # Aperçu print("\n--- Aperçu des 3 premiers comptes ---") print(df[['UserName', 'Password']].head(3).to_string(index=False)) except FileNotFoundError: print(f"❌ ERREUR : Le fichier '{input_file}' n'a pas été trouvé dans ce dossier.") except Exception as e: print(f"❌ ERREUR INATTENDUE : {e}") if __name__ == "__main__": main()