os.popen().read() - 字符映射解码错误
os.popen().read() - charmap decoding error
我已经阅读了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>
我认为这可能会发生,因为文件夹中的某些文件在它们的文件中包含 ł、ą、ę 和 ć 等字母名字。不过我不知道如何解决这个问题。
os.popen
只是 subprocess.Popen
的包装器以及 io.TextIOWrapper
对象:
The returned file object reads or writes text strings rather than bytes.
如果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')
在这种情况下,使用 subprocess.Popen
过于笼统、冗长且难以记忆。请改用 subprocess.check_output
。
它returns一个bytes
对象,可以用decode
函数转换成str
。
import subprocess
x = subprocess.check_output(['ls','/'])
print(x.decode('utf-8'))
如果有人像我一样在 python2 中使用 with 语句和 readline() 的组合(对于timezone Util in Windows), 它不适用于 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:
我已经阅读了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>
我认为这可能会发生,因为文件夹中的某些文件在它们的文件中包含 ł、ą、ę 和 ć 等字母名字。不过我不知道如何解决这个问题。
os.popen
只是 subprocess.Popen
的包装器以及 io.TextIOWrapper
对象:
The returned file object reads or writes text strings rather than bytes.
如果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')
在这种情况下,使用 subprocess.Popen
过于笼统、冗长且难以记忆。请改用 subprocess.check_output
。
它returns一个bytes
对象,可以用decode
函数转换成str
。
import subprocess
x = subprocess.check_output(['ls','/'])
print(x.decode('utf-8'))
如果有人像我一样在 python2 中使用 with 语句和 readline() 的组合(对于timezone Util in Windows), 它不适用于 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: