Python 3中str()函数默认返回字节串?需全局设置编码吗?
问题解答
核心问题原因
你对str()函数处理字节串的逻辑理解有误:
subprocess.check_output()默认返回的是字节串(bytes类型),不是字符串。- 当你给
str()传入bytes对象但不指定encoding参数时,它不会把字节串解码成字符串,而是生成这个bytes对象的字符串表示形式(也就是你看到的带b'...'的格式),这是Python的正常行为,和全局编码设置无关。
正确的处理方式
有三种更合理的方式来获取字符串格式的输出:
直接在subprocess中指定编码
给check_output()加上encoding='utf-8'参数,让它直接返回字符串,省去后续解码步骤:#!/usr/bin/python3 import subprocess # 直接指定encoding,返回字符串 str2 = subprocess.check_output(['cat', '/proc/mounts'], encoding='utf-8') mounts = str2.splitlines() for mount in mounts: if mount.startswith('/dev/sd'): print(mount)使用bytes对象的decode()方法
对返回的字节串直接调用decode('utf-8')解码,比用str()更直观:test = mounts[x].decode('utf-8')保留原写法但明确encoding参数
如果你坚持用str(),就必须指定encoding参数,这本质上和decode()做的是一样的解码操作:test = str(mounts[x], encoding='utf-8')
关于全局编码
不需要设置全局编码,Python 3的默认文本编码已经是UTF-8,你的问题完全是对str()函数处理bytes对象的逻辑误解导致的,和全局编码无关。
内容的提问来源于stack exchange,提问作者matnieuw
相关产品推荐
相关产品推荐

