2017-04-13 261 views
2

如何从python3脚本中删除b符号?如何在python3中删除b符号

import subprocess 

get_data=subprocess.check_output(["df -k | awk '{print $6}'"],shell=True) 
data_arr=get_data.split() 
data_arr.pop(0) 
data_arr.pop(0) 
for i in data_arr[:]: 
    print(str(i)) 

输出

b'/dev/shm' 
b'/run' 
b'/sys/fs/cgroup' 
b'/' 
b'/tmp' 
b'/test' 
b'/boot' 
b'/home' 
b'/var' 
b'/mnt/install' 
b'/mnt/snapshot' 
b'/mnt/share' 
b'/mnt/storage' 
b'/mnt/linux' 
b'/mnt/download' 
b'/run/user/1001' 
+0

我们怎么知道你的意思,朋友? –

+0

我看到:当它将结果作为二进制返回时,返回'b'前缀'check_output'。然后,将字节解码为字符串。 –

+0

@ Jean-FrançoisFabre。字节,而不是二进制。 –

回答

3

b的符号表示的check_process输出为bytes,而不是一个str。删除它,最好的办法是将输出转换成字符串你做任何进一步的工作之前它:

byte_data=subprocess.check_output(["df -k | awk '{print $6}'"],shell=True) 
str_data = byte_data.decode('utf-8') 
data_arr=str_data.split() 
... 

decode方法将带您可能必须在字符串中任何Unicode的照顾。如果您的默认编码(或者我认为awk使用的编码)不是UTF-8,请使用上例中的正确编码替换。

解决此问题的一种更好的方法是告诉check_outputstdout作为文本流打开。最简单的方法是添加一个universal_newlines=True的说法,这将使用默认的编码当前区域:

str_data = subprocess.check_output(["df -k | awk '{print $6}'"], shell=True, universal_newlines=True) 

或者,您也可以指定一个明确的编码:

str_data = subprocess.check_output(["df -k | awk '{print $6}'"], shell=True, encoding='utf-8') 

在这两种情况下,您不需要解码,因为输出已经是str而不是bytes

+0

@jsbueno。就这样。固定。 –

+0

非常感谢这是非常棒的解决方案。有一个愉快的长周末和复活节到所有 – user3661564

+0

@ user3661564。用更好的答案做了更新。请选择适合您的答案。 –