我已阅读UnicodeDecodeError: 'charmap' codec can't decode byte X in position Y: character maps to <undefined>。虽然错误消息类似,但代码完全不同,因为我在此问题中使用os.popen
,而不是open
。我无法使用其他问题的答案来解决这个问题。
output = os.popen("dir").read()
该行应该将命令“dir”的输出分配给变量“output”,导致此错误:
'charmap' codec can't decode byte 0x88 in position 260: character maps to <undefined>
我认为这可能会发生,因为文件夹中的某些文件名称中包含ł,±,<和ć等字母。我不知道如何解决这个问题。
答案 0 :(得分:4)
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')
答案 1 :(得分:0)
在这种情况下,使用subprocess.Popen
太笼统,太冗长且难以记住。请改用subprocess.check_output
。
它返回一个bytes
对象,可以使用str
函数将其转换为decode
。
import subprocess
x = subprocess.check_output(['ls','/'])
print(x.decode('utf-8'))
答案 2 :(得分:0)
如果有人像我一样将 with 语句与 python2 中的readline()结合使用(在Windows中为时区Util),则不适用于python3:
with os.popen("tzutil /l") as source:
key, value = self.get_key_value(source, True)
while value and key:
timezones_to_json.append({u"key": key, u"value": value, u"toolTip": key})
key, value = self,get_key_value(source, False)
return timezones_to_json
def get_key_value(self, source, first=False):
if not first:
source.readline()
value = source.stdout.readline().strip()
key = source.stdout.readline().strip()
return key, value
所以我对 python3 的更改是:
像@Josh Lee一样,我改用了subprocess.Popen,但后来却有了AttributeError: __exit__
因此您必须在末尾插入.stdout
,所以with语句中的对象具有__enter__
和__exit__
方法:
with subprocess.Popen(['tzutil', '/l'], stdout=subprocess.PIPE).stdout as source: