Bonjour Je suis en train de créer un code qui trouve les fichiers présents dans un dossier, trouve le SHA256 du contenu de chacun d'eux puis les copie dans un autre dossier avec pour nom le SHA256 et l'extension. Pour les fichiers txt, cela fonctionne parfaitement, mais pour un fichier autre (pub par exemple), j'ai le droit à une erreur :
Traceback (most recent call last):
File "creerFichier.py", line 48, in <module>
creerFichier()
File "creerFichier.py", line 35, in creerFichier
contenu = fluxLecture.read()
File "/usr/lib/python3.6/codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in position 0: invalid continuation byte
Avec le code suivant :
#! /usr/bin/python
# -*- coding:utf-8 -*-
import logs
import BDD
import os
import hashlib
def creerFichier():
# Fonction qui va s'executer via la maintenance assez régulièrement
# Elle regarde dans le dossier ADDFILES si il y a des fichiers
# Si oui, elle les copie dans le dossier HOSTEDFILES, les renomme de type SHA256.extention
# Elle envoie vers la fonction contenue dans BDD.py qui va ajouter les fichiers à la base de données
# Et pour finir, elle supprime les fichiers ajoutés de façon à ce que le dossier ADDFILES soit vide.
repertoire = "ADDFILES"
# Vérifier si le dossier ADDFILES existe, sinon le créer
try:
os.makedirs("ADDFILES")
except OSError:
if not os.path.isdir("ADDFILES"):
raise
# Vérifier si le dossier HOSTEDFILES existe, sinon le créer
try:
os.makedirs("HOSTEDFILES")
except OSError:
if not os.path.isdir("HOSTEDFILES"):
raise
dirs = os.listdir(repertoire)
# This would print all the files and directories
for file in dirs:
fichier = repertoire + "/" + file
if os.path.isfile(fichier):
# L'élément est un fichier, c'est bon (et pas un dossier)
fluxLecture = open(fichier, "r")
contenu = fluxLecture.read()
fluxLecture.close()
shaFichier = hashlib.sha256(contenu.encode()).hexdigest()
filename = shaFichier + '.' + file.split('.')[-1]
fileDir = "HOSTEDFILES/" + filename
fluxEcriture = open(fileDir, "w")
fluxEcriture.write(contenu)
fluxEcriture.close()
os.remove(fichier)
# L'ajouter à la BDD
BDD.ajtFichier(filename)
logs.ajtLogs("INFO : Un nouveau fichier hébergé a été ajouté avec succès : " + filename)
creerFichier()
Pourrez-vous m'indiquer comment corriger mon code pour qu'il puisse fonctionner avec tous les fichiers ? Merci d'avance
Déjà, pour lire un fichier, il faut préférer le faire comme cela :
with open(chemin, "r", encoding="utf-8") as fichier:
contenu = fichier.read()
Ensuite, on t'indique que le fichier que tu ouvre n'est pas encodé en utf-8. Soit tu t'assure que tous les fichiers que tu veux traiter sont en utf-8, en les convertissant le cas échéant. Soit tu stocke quelque part dans ton programme quel encodage est utilisé pour quel type de fichier, et tu ouvre chaque fichier avec l'encodage qui lui est propre en modifiant le paramètre encoding de open.
MAIS, si tu lis un fichier avec un encodage différent de utf-8, assure toi de repasser les données obtenues en utf-8 avant de commencer à travailler avec, sinon tu n'en finira plus avec des bugs tous plus incompréhensibles les uns que les autres.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
typage structurel ftw