2017-02-03 2 views
1

Ceci n'est pas un doublon. L'erreur est similaire, mais le code est complètement différent et sans rapport. Je ne peux pas utiliser les réponses des autres questions pour résoudre ce problème. Il n'y a pas encore de réponse à cette question sur stackoverflow.os.popen(). Read() - erreur de décodage charmap

output = os.popen("dir").read() 

Cette ligne, qui est censé affecter la sortie de la commande « dir » à la variable « sortie », est à l'origine de cette erreur:

'charmap' codec can't decode byte 0x88 in position 260: character maps to <undefined> 

Je pense que cela pourrait être happenning parce que certains fichiers dans le dossier contient des lettres telles que ł, ą, ę et ć dans leur nom. Je ne sais pas comment résoudre ce problème. J'ai examiné certaines questions qui sont censées être similaires aux miennes, mais elles concernent toutes la lecture de fichiers.

+0

double possible de [UnicodeDecodeError: codec 'charmap' ne peut pas décoder octet X en position Y: caractère cartes à ] (http://stackoverflow.com/questions/9233027/unicodedecodeerror-charmap-codec-cant-decode-byte-x-in-position-y-character) – DyZ

+0

Ceci n'est pas un doublon, et quiconque lirait réellement tout le courrier le saurait . – David

+0

C'est peut-être parce que votre titre - le message d'erreur exact - est un appât déclencheur instantané. * De loin le plus * des questions similaires sont des doublons simples. Si vous modifiez votre titre et signalez qu'il s'agit spécifiquement d'une fonction liée au système de fichiers plutôt que d'un codage de fichier local, vous obtiendrez peut-être une meilleure réception. (À moins que * ce soit le même problème - je n'en suis pas sûr non plus.) – usr2564301

Répondre

2

os.popen est juste une enveloppe autour subprocess.Popen avec un objet io.TextIOWrapper:

The returned file object reads or writes text strings rather than bytes.

Si l'encodage par défaut de Python ne fonctionne pas pour vous, vous devez utiliser directement subprocess.Popen.

Le problème sous-jacent est que cmd écrit ansi garbage par défaut, même lorsque la sortie est à un canal. Ce comportement peut dépendre de votre version de Windows.

Vous pouvez corriger cela en passant /U drapeau cmd:

p = subprocess.Popen('cmd /u /c dir', stdout=subprocess.PIPE) 
result = p.communicate() 
text = result[0].decode('u16') 
+0

** subprocess.Popen() ** est déroutant. J'ai déjà essayé de l'utiliser, mais cela n'a jamais fonctionné correctement, peu importe comment j'ai essayé. – David

+0

La définition de os.popen montre l'invocation que vous avez déjà utilisée, vous pouvez donc l'utiliser comme point de départ. https://hg.python.org/cpython/file/3.6/Lib/os.py Il existe un objet Popen dont vous avez seulement regardé le fichier stdout. –

+0

Impossible de comprendre. Jusqu'à présent, seulement réussi à provoquer la même erreur à nouveau. – David