os.popen().read() - charmap 解码错误

Dav*_*vid 6 python windows cmd python-3.x python-os

我已经阅读了UnicodeDecodeError: 'charmap' codec can't decode byte X in position Y: character maps to <undefined>。虽然错误信息相似,但代码完全不同,因为我os.popen在这个问题中使用了open. 我不能使用其他问题的答案来解决这个问题。

output = os.popen("dir").read()
Run Code Online (Sandbox Code Playgroud)

该行应该将命令“dir”的输出分配给变量“output”,导致此错误:

'charmap' codec can't decode byte 0x88 in position 260: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)

我认为这可能是因为文件夹中的某些文件包含诸如?, ?, ? 以他们的名义。我不知道如何解决这个问题。

Jos*_*Lee 6

os.popen只是一个subprocess.Popen带有io.TextIOWrapper对象的包装器:

返回的文件对象读取或写入文本字符串而不是字节。

如果 Python 的默认编码不适合你,你应该subprocess.Popen直接使用。

潜在的问题是 cmd 默认写入 ansi 垃圾,即使输出到管道也是如此。此行为可能取决于您的 Windows 版本。

您可以通过将/U标志传递给 cmd来解决此问题:

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