2017-04-13 4 views
2

bシンボルをpython3スクリプトから削除するには?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方法は、文字列を持っている可能性のあるユニコードの世話をします。それを削除するための最良の方法は、あなたがそれに任意の更なる作業を行う前に、文字列に出力を変換することです。デフォルトのエンコード(またはawkが使用するもの)がUTF-8でない場合は、上記の例の正しいエンコードに置き換えてください。

この問題を回避するには、check_outputstdoutをテキストストリームとして開くことをお勧めします。 、いずれの場合も

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

:あなたが明示的にエンコーディングを指定することができ、また

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

:最も簡単な方法は、あなたの現在のロケールのデフォルトエンコーディングを使用しますuniversal_newlines=True引数を、追加することですbytesではなく、出力が既にstrになるため、デコードする必要はありません。

+0

@jsbueno。そうです。一定。 –

+0

ありがとう、これは素晴らしい解決策です。長い週末と復活祭を全部 – user3661564

+0

@ user3661564にしてください。より良い答えで更新しました。あなたがうまくいけば答えを選択してください。 –

関連する問題