2017-04-13 93 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。用更好的答案做了更新。請選擇適合您的答案。 –