Renommé fichiers en masse avec un .sqlite [Résolu]

Messages postés
38
Date d'inscription
samedi 21 février 2009
Dernière intervention
25 mars 2018
- 5 janv. 2014 à 07:06 - Dernière réponse :
Messages postés
38
Date d'inscription
samedi 21 février 2009
Dernière intervention
25 mars 2018
- 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
Afficher la suite 

Votre réponse

3 réponses

Messages postés
96
Date d'inscription
lundi 9 octobre 2006
Dernière intervention
24 février 2018
5 janv. 2014 à 23:20
0
Merci
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")
Commenter la réponse de lespinx
Messages postés
38
Date d'inscription
samedi 21 février 2009
Dernière intervention
25 mars 2018
6 janv. 2014 à 08:24
0
Merci
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!
Commenter la réponse de Cyber-Crash
Messages postés
38
Date d'inscription
samedi 21 février 2009
Dernière intervention
25 mars 2018
6 janv. 2014 à 10:24
0
Merci
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
Commenter la réponse de Cyber-Crash

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.