Forum Programmation.python Périphérique carte SD

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
2
22
juin
2025

Bonjour

Je cherche à faire coder un petit script permettant :

  1. Aller chercher en mode récursif les fichiers avec l'extension ".NEF" sur la carte SD que j'enfiche dans mon ordinateur portable. Les fichiers sont dans 2 sous niveaux de dossiers.

  2. Renommer ces fichiers en les numérotant sur 5 chiffres (ex: 00001.NEF)

  3. Sauvegarder sur le disque dur le dernier numéro à prendre pour que la numérotation continue à la prochaine recherche sur la carte SD.

  4. Créer (ou tester) l'existence du dossier Images sur le disque dur de mon ordinateur sous Linux Debian, créer ou tester la présence d'un sous répertoire pour l'année en cours (pas celle des images) et créer ou tester un sous répertoire du quantième du jour. Et disposer les images de la carte SD dans le dossier du quantième du jour.

J'en ai besoin pour ma pratique de photographe amateur.

J'ai demandé à l'IA de faire cela. Le script fonctionne sauf qu'il ne trouve pas ma carte SD enfichée dans mon ordinateur. Il trouve bien mon disque dur externe mais pas le lecteur de carte SD.


Je cherche la solution pour que la carte SD soit accéssible avec ce script que je vous indique ici :

!/usr/bin/env python3

import os
import shutil
import sys
import time
from datetime import datetime

Configuration

BASE_DIR = os.path.expanduser("~/Images")
NUM_FILE = os.path.join(BASE_DIR, "last_number.txt")
FILE_TYPES = ['.NEF', '.JPG', '.JPEG', '.CR2', '.ARW', '.DNG'] # Ajoutez d'autres extensions si nécessaire

def get_removable_devices():
"""Retourne la liste des périphériques amovibles montés"""
devices = []
with open('/proc/mounts', 'r') as f:
for line in f:
parts = line.split()
if parts[1].startswith('/media/philippe/') or parts[1].startswith('/mnt/'):
devices.append(parts[1])
return devices

def get_next_number():
"""Récupère ou initialise le prochain numéro de fichier"""
try:
with open(NUM_FILE, 'r') as f:
last_num = int(f.read().strip())
except (FileNotFoundError, ValueError):
last_num = 0

return last_num + 1

def update_last_number(number):
"""Met à jour le dernier numéro utilisé"""
os.makedirs(os.path.dirname(NUM_FILE), exist_ok=True)
with open(NUM_FILE, 'w') as f:
f.write(str(number))

def get_target_path(file_path):
"""Détermine le chemin cible basé sur la date du fichier"""
# Essayez d'abord avec la date de modification
mtime = os.path.getmtime(file_path)
file_date = datetime.fromtimestamp(mtime)

year = file_date.year
day_of_year = file_date.timetuple().tm_yday

# Crée les dossiers si nécessaire
year_dir = os.path.join(BASE_DIR, str(year))
day_dir = os.path.join(year_dir, f"{day_of_year:03d}")

os.makedirs(day_dir, exist_ok=True)

return day_dir

def copy_and_rename_files():
"""Copie et renomme les fichiers des périphériques amovibles"""
devices = get_removable_devices()
if not devices:
print("Aucun périphérique amovible détecté.")
return

next_num = get_next_number()
files_copied = 0

for device in devices:
    print(f"Traitement du périphérique: {device}")
    for root, _, files in os.walk(device):
        for file in files:
            ext = os.path.splitext(file)[1].upper()
            if ext in FILE_TYPES:
                src_path = os.path.join(root, file)
                try:
                    target_dir = get_target_path(src_path)
                    new_name = f"{next_num:05d}{ext.lower()}"
                    dest_path = os.path.join(target_dir, new_name)

                    # Copie le fichier
                    shutil.copy2(src_path, dest_path)
                    print(f"Copié: {src_path} -> {dest_path}")

                    next_num += 1
                    files_copied += 1
                except Exception as e:
                    print(f"Erreur lors du traitement de {src_path}: {e}")

if files_copied > 0:
    update_last_number(next_num - 1)
    print(f"\n{files_copied} fichiers copiés. Dernier numéro utilisé: {next_num - 1}")
else:
    print("Aucun fichier correspondant trouvé.")

def main():
print("=== Script de copie et organisation de fichiers ===")
print(f"Base directory: {BASE_DIR}")

try:
    copy_and_rename_files()
except KeyboardInterrupt:
    print("\nOpération annulée par l'utilisateur.")
    sys.exit(1)
except Exception as e:
    print(f"Une erreur s'est produite: {e}")
    sys.exit(1)

if name == "main":
main()

  • # ça n'existe pas déjà cet outil ?

    Posté par  (site web personnel) . Évalué à 4 (+2/-0).

    Hum, y'a un truc qui me dérange à demander à des gens de corriger un script obtenu par ia…

    Sinon, il me semble que ce genre de fonction d'import et renommage de fichiers existe déjà dans les logiciels de gestion de photos. Lesquel utilisez vous ?

    • [^] # Re: ça n'existe pas déjà cet outil ?

      Posté par  (site web personnel) . Évalué à 4 (+2/-0).

      Après ça reste une question purement Linux : pourquoi quand la carte SD est-elle montée, n'apparaît-elle pas dans /mnt/ ou /media/philippe ? Alors que le disque dur, visiblement, oui.

      N'ayant pas d'indications sur la distribution employée, les points de montage, et nom d'utilisateur, je ne vois pas trop comment aider. Mais la question me semble avoir sa place dans ce forum. Après tout, tout le monde ne peut pas être programmeur. Ici, l'auteur de la question a déjà fait (faire) une très grosses parties du boulot, et ne demande quasiment rien en comparaison de sa problématique initale… C'est super. Même si c'est à base de LLM.

      « IRAFURORBREVISESTANIMUMREGEQUINISIPARETIMPERAT » — Odes — Horace

      • [^] # Re: ça n'existe pas déjà cet outil ?

        Posté par  . Évalué à 4 (+2/-0).

        N'ayant pas d'indications sur la distribution employée,

        je pense que la distrib est un point important. Je suis pas sûr que toutes les distribs fassent de l'auto-montage de cartes SD par défaut.

        (Perso, je pense même que c'est une assez mauvaise idée d'auto-monter les supports qui peuvent se retirer mécaniquement sans avertir l'OS, mais c'est p-e que moi.)

    • [^] # Re: ça n'existe pas déjà cet outil ?

      Posté par  (site web personnel) . Évalué à 2 (+1/-1).

      eh bien, perso, j'aimerais que l'auteur de l'entrée de forum (re-)lise la doc du wiki aide-edition pour remettre en forme le code (il y a un bouton Modifier dans les entrées de forum).

      En attendant, je ne répondrai pas :p

    • [^] # Re: ça n'existe pas déjà cet outil ?

      Posté par  (site web personnel) . Évalué à 4 (+2/-0).

      Hum, y'a un truc qui me dérange à demander à des gens de corriger un script obtenu par ia…

      Alors qu'il suffisait de demander à l'IA de coder sans bug #tipsdepro

  • # Linux debian

    Posté par  . Évalué à 1 (+1/-1). Dernière modification le 22 juin 2025 à 20:35.

    Je suis sous linux debian version stable actuelle.
    N'étant pas développeur du tout, je n'ai pas les connaissances pour mettre mon script aux formes voulues dans ce forum, j'en suis désolé.
    Je souhaite simplement un petite aide pour résoudre mon problème.
    A vous de voir …

    • [^] # Re: Linux debian

      Posté par  (site web personnel) . Évalué à 3 (+1/-0).

      Pouvez-vous :
      — insérer votre carte sd
      — taper dans un terminal : df -h
      — nous communiquer le résultat de cette commande
      — et le résultat du script que vous souhaitez employer ?

      « IRAFURORBREVISESTANIMUMREGEQUINISIPARETIMPERAT » — Odes — Horace

    • [^] # Re: Linux debian

      Posté par  (site web personnel) . Évalué à 4 (+2/-0).

      je n'ai pas les connaissances pour mettre mon script aux formes voulues dans ce forum, j'en suis désolé.

      franchement ?!

      Qu'est-ce qui est dur de modifier ton entrée de forum ? (bouton modifier en fin d'entrée) et ajouter :

      • ```python en passant une ligne blanche avant ton script
      • ``` après ton script

      En outre, utiliser le lien Répondre permet de conserver l'arborescence des réponses pour savoir à quoi tu réponds ;-)

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.