Partage
  • Partager sur Facebook
  • Partager sur Twitter

UnicodeDecodeError: 'utf-8' codec can't decode byt

Anonyme
    22 octobre 2018 à 19:49:11

    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

    • Partager sur Facebook
    • Partager sur Twitter
      23 octobre 2018 à 10:47:12

      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.

      • Partager sur Facebook
      • Partager sur Twitter

      typage structurel ftw

      UnicodeDecodeError: 'utf-8' codec can't decode byt

      × 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.
      • Editeur
      • Markdown