Problème d'encodage

Fermé
Elponito Messages postés 51 Date d'inscription vendredi 23 mai 2014 Statut Membre Dernière intervention 21 décembre 2015 - 10 juin 2014 à 16:45
Elponito Messages postés 51 Date d'inscription vendredi 23 mai 2014 Statut Membre Dernière intervention 21 décembre 2015 - 11 juin 2014 à 08:54
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 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
10 juin 2014 à 18:47
'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 vendredi 23 mai 2014 Statut Membre Dernière intervention 21 décembre 2015 8
11 juin 2014 à 08:54
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