Problème d'encodage

Elponito Messages postés 51 Date d'inscription   Statut Membre Dernière intervention   -  
Elponito Messages postés 51 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,

J'ai une erreur que je n'arrive pas à corriger, j'ai un script (que @gravgun m'a soufflé) qui parcours mon arborescence et pour certain fichier j'ai un problème apparemment avec le nom..

import os, time

year = 365*24*60*60

source = "C:\\"
taille = sizeOffice = sizeGraphic = sizeVideo = sizeMail = 0

office = '.ppt', '.pptm', '.pptx'
graphic = '.jpg'
video = '.mp4', '.mov', '.avi', '.vob', '.wmv'
mail = '.pst'

for root, direc, filenames in os.walk(source):
	for filename in filenames:
		dir_path = os.path.join(root, filename)
		if filename.lower().endswith((office)):
			if time.time() - os.path.getatime(os.path.join(root, filename)) > 2*year:
				print(dir_path)
				taille += os.path.getsize(os.path.join(root, filename))
				sizeOffice += os.path.getsize(os.path.join(root, filename))
		elif filename.lower().endswith((graphic)):
			if time.time() - os.path.getatime(os.path.join(root, filename)) > 3*year:
				print(dir_path)
				taille += os.path.getsize(os.path.join(root, filename))
				sizeGraphic += os.path.getsize(os.path.join(root, filename))
		elif filename.lower().endswith((video)):
			if time.time() - os.path.getatime(os.path.join(root, filename)) > 3*year:
				print(dir_path)
				taille += os.path.getsize(os.path.join(root, filename))
				sizeVideo += os.path.getsize(os.path.join(root, filename))
		elif filename.lower().endswith((mail)):			
			print(dir_path)
			taille += os.path.getsize(os.path.join(root, filename))
			sizeMail += os.path.getsize(os.path.join(root, filename))

taille //= 1000*1000*1000
print("Les fichiers listés représentent:", taille,"Go")
print("part de fichiers: ")
print("office: ", sizeOffice)
print("graphic: ", sizeGraphic)
print("video: ", sizeVideo)
print(".pst: ", sizeMail)


et voici l'erreur:

return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\x81' in position 102: character maps to <undefined>

je ne précise pas d'encodage et puisque il s'agit de python 3, c'est donc de l'utf-8
mon fichier est enregistré en utf-8 également.. J'ai cherché mais je n'ai rien trouvé, si quelqu'un peux m'aider cela serait top car je commence à désespéré..

Merci d'avance

2 réponses

ElementW Messages postés 4814 Date d'inscription   Statut Contributeur Dernière intervention   1 223
 
'lut, me revoilà ;)
Tu as la trace des appels qui a donné cette erreur?
Après quelques recherches, c'est très probablement le print qui fout tout en l'air: Windows est mal fait sur ce point: sa console déteste la sortie en Unicode. Python devrait gérer ça avec la fonction API Windows
WriteConsole
, mais pour garder une continuité avec les autres OS et mécanismes, il utilise la sortie standard. Or, Python ne sait pas encoder les noms bizzares pour cette console encodée en CP-jesaispasquoi.
J'ai trouvé ça sur ce topic StackOverflow et ils propose un code pour permettre l'écriture de noms internationaux dans la console, tu peux t'en servir.
Mais ça reste moche.
0
Elponito Messages postés 51 Date d'inscription   Statut Membre Dernière intervention   8
 
Encore une fois merci @gravgun :) Tu as tout à fait raison c'est bien la commande print qui fous la merde, du coup j'avais remplacer avec ceci:

print(os.path.join(root, filename).encode(sys.stdout.encoding,'replace'))


mais ça me met des point d'interrogation du coup dans mes noms de fichiers et je redirige les sorties vers un fichier texte et de ce fait je peux pas réutiliser le résultat.. Je vais me pencher sur ta solution, encore une fois merci pour ton aide précieuse :)
0