我有
cmd = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE) for line in cmd.stdout: columns = line.split(' ') print (columns[3])
第3行出现错误类型Str不支持缓冲区API。
我在做错什么我在Python 3.3上
您正在读取二进制数据,而不是str,因此您需要先解码输出。如果将universal_newlines参数设置为True,则stdout使用locale.getpreferredencoding()方法的结果自动解码 (与打开文本文件相同):
str
universal_newlines
True
stdout
locale.getpreferredencoding()
cmd = subprocess.Popen( 'dir', shell=True, stdout=subprocess.PIPE, universal_newlines=True) for line in cmd.stdout: columns = line.decode().split() if columns: print(columns[-1])
如果您使用Python 3.6或更高版本,则可以encoding对Popen()调用使用显式参数,以指定要使用的其他编解码器,例如UTF-8:
encoding
Popen()
cmd = subprocess.Popen( 'dir', shell=True, stdout=subprocess.PIPE, encoding='utf8') for line in cmd.stdout: columns = line.split() if columns: print(columns[-1])
如果您需要在Python 3.5或更早版本中使用其他编解码器,请不要使用universal_newlines,只需从字节中显式解码文本即可。
您试图bytes使用str参数拆分值:
bytes
>>> b'one two'.split(' ') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: Type str doesn't support the buffer API
通过解码,您可以避免该问题,并且您的print()调用将不必在输出之前添加b'..'任何一个。
print()
b'..'
但是,您可能只想使用os模块来获取文件系统信息:
os
import os for filename in os.listdir('.'): print(filename)