Renommé fichiers en masse avec un .sqlite

Résolu
Cyber-Crash Messages postés 42 Date d'inscription samedi 21 février 2009 Statut Membre Dernière intervention 1 octobre 2020 - 5 janv. 2014 à 07:06
Cyber-Crash Messages postés 42 Date d'inscription samedi 21 février 2009 Statut Membre Dernière intervention 1 octobre 2020 - 6 janv. 2014 à 10:24
L'année commence mal pour moi... J'ai plein de fichiers photos qui n'ont plus leur nom d'origine mais j'ai un fichier .sqlite qui contient tous leurs anciens noms et leurs tailles.

Dans mon fichier.sqlite j'ai entre-autre une colonne "zoriginalfilesize" et une colonne "zoriginalfilename" sur 1725 lignes

J'aurai voulu automatisé une tache qui >
1: Regarde dans mon .sqlite sur la ligne 1 dans la colonne "zoriginalfilesize" récupère la taille (4183439 octets).
2: Va dans mon dossier windows avec les photos don le nom a changer pour retrouver le fichier qui fait 4183439 octets et le renomme avec le nom qui est écrit dans la colonne zoriginalfilesize de la ligne 1
3:passe à la ligne d'en dessous et ainsi de suite.
Je voudrai éviter de faire les 1725 ligne manuellement.

Je ne suis pas un utilisateur de python, j'ai déjà survolé quelque codes mais sans jamais me plonger dedans, je crois savoir que ce que je demande est simple a réalisé avec python, désolé pour la naïveté donc...


Merci

3 réponses

lespinx Messages postés 106 Date d'inscription lundi 9 octobre 2006 Statut Membre Dernière intervention 23 novembre 2022 77
5 janv. 2014 à 23:20
Bonsoir,

Que se passe t-il si plusieurs fichiers ont la même taille?

Je joins un bout de code qui liste le nom et la taille des fichiers depuis un dossier racine.
Le résultat est écrit dans un fichier et les doublons(taille) sont signalés.

La partie accès database est en commentaire et les paramètres à modifier sont décrits en début du code.
Je part de la taille du fichier pour accéder à la database.
Je ne traite pas les fichiers qui ont la même taille.

Si ce code fonctionne il aboutit à la création d'un fichier de commande RENAME(norme Windows)


# -*- coding: ISO-8859-15 -*-

'''
o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o
A modifier Ligne 52 Chemin de la database
Ligne 53 Repertoire racine des fichiers photos
Ligne 54 Extensions
Ligne 69 Fichier "Ficout" Tailles des fichiers et doublons
Ligne 70 Fichier "Ficren" fichier commande RENAME
Ligne 79 Requete SQL
Ligne 81 a 92 Appel de la requete SQL

Paramètres dossier = dossier à examiner
o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o
'''
import os, sys, sqlite3

def Alloc_Database(database):
global cur, db
db = sqlite3.connect(database)
cur = db.cursor()

def Requete_Select(SQL):
try:
cur.execute(SQL)
return cur
except sqlite3.Error as e: print("ERREUR ", SQL, e.args[0])

def scan_dossier(repertoire,extensions):
cpt_fichier = 0
lst_repertoire = os.listdir(repertoire)

for fichier in lst_repertoire:
chemin = os.path.join(repertoire, fichier)

if os.path.isfile(chemin):
ext = os.path.splitext(fichier)
if ext[1].lower() in extensions:
cpt_fichier += 1
lst_fichiers.append(os.path.normpath(os.path.join(repertoire, fichier)))

if os.path.isdir(chemin):
scan_dossier(chemin, extensions)

print (cpt_fichier,"Photos dans", repertoire)

def controle_unicode(nom):
#Si Python V2.xx
if sys.version_info[0] == 2:
nom = os.path.normpath(nom)
if isinstance(nom, unicode): nom = nom.encode('ISO-8859-15')
return nom

#===================================================

#Initialisations
database = "G:\\Sqlite\\Databases\\MaDatabase.db3"
repertoire = "D:\\Photos\\TESTS" #Répertoire racine
extensions = (".jpg")
#extensions = (".jpg", ".tif", ".tiff", ".png", ".cr2")
global lst_fichiers
lst_fichiers = []
lst_tailles = []
msg = ""

#Allocation de la database
Alloc_Database(database)

#Collecte du chemin des fichiers
scan_dossier(repertoire, extensions)

#Ecriture du résultat dans un fichier
ficout = open("G:\\Dossier\\Tests\\Tailles_fichiers.txt", "w")
ficren = open("G:\\Dossier\\Tests\\Rename_fichiers.txt", "w")

for chemin in lst_fichiers:
info_taille = os.stat(chemin).st_size

if info_taille not in lst_tailles:
lst_tailles.append(info_taille)

## #Si zoriginalfilesize est de type integer
## SQL = "SELECT zoriginalfilename FROM MaTable WHERE zoriginalfilesize = " + str(info_taille)
## #Si zoriginalfilesize est de type text
## SQL = 'SELECT zoriginalfilename FROM MaTable WHERE zoriginalfilesize = "' + str(info_taille) + '"'
## cur = Requete_Select(SQL)
##
## for row in cur:
## chemin_ = os.path.split(chemin)[0]
## extent = os.path.splitext(chemin_)[1]
## nom = controle_unicode(row[0])
## cmd = "RENAME " + chemin + " " + chemin_ + "\\" + nom + extent
## ficren.write(cmd + "\n")

else:
msg = " !!!DOUBLON"
ficout.write(chemin.strip().ljust(90, " ") + str(info_taille) + msg + "\n")
msg = ""

ficout.close()
ficren.close()
cur.close()
db.close()
print("\nFin du traitement")
0
Cyber-Crash Messages postés 42 Date d'inscription samedi 21 février 2009 Statut Membre Dernière intervention 1 octobre 2020
6 janv. 2014 à 08:24
Salut,

Merci beaucoup, se scripte me débloque!
Génial!


Cependant il semble que certaine images coince mais tout va bien si je traite par groupe d'image afin d'isolé les fichiers qui bloquent.
Je reçois:

Traceback (most recent call last):
File "G:\output\other-data\Nouveau document texte.py", line 93, in <module>
cmd = "RENAME " + chemin + " " + nom + extent
TypeError: Can't convert 'NoneType' object to str implicitly

Pour la gestion des doublons je compté demander après que je reçois au moins une réponse, je m'attendais pas à être aidé en une seul!
0
Cyber-Crash Messages postés 42 Date d'inscription samedi 21 février 2009 Statut Membre Dernière intervention 1 octobre 2020
6 janv. 2014 à 10:24
Les fichiers gênant étai a 0 octets, je devais avoir des images endommagé... :(

Après avoir supprimé la 10ene de fichier JPG à o octets tout c'est bien exécuté.


Merci Lespinx

voilà qui est resolu
0
Rejoignez-nous