无法拆分,需要类似字节的对象,而不是' str'

时间:2018-06-13 05:02:45

标签: python linux shell

我正在尝试将tshark(或任何shell命令)写入文件。我尝试过使用解码和编码,但仍然对我大喊大叫,split方法不能使用数据类型。在"捕获停止"之后,我的尝试仍然在代码中作为注释。线。我也试过r,a和a +作为开放模式,但我实际上得到了这里使用的ab +模式的输出,所以我选择保留它。即使使用+模式也说" blah"是字节。我想保留文件附加输出。谢谢!

import subprocess
import datetime

x="1"
x=input("Enter to continue. Input 0 to quit")
while x != "0":
    #print("x is not zero")
    blah = subprocess.check_output(["tshark -i mon0 -f \"subtype probe-req\" -T fields -e wlan.sa -e wlan_mgt.ssid -c 2"], shell=True)
    with open("results.txt", 'ab+') as f:
        f.write(blah)
    x=input("To get out enter 0")
print("Capturing Stopped")

# blah.decode()
#blah = str.encode(blah)

#split the blah variable by line
splitblah = blah.split("\n")

#repeat  for each line, -1 ignores first line since it contains headers
for value in splitblah[:-1]:

    #split each line by tab delimiter
    splitvalue = value.split("\t")

#Assign variables to split fields
MAC = str(splitvalue[1])
SSID = str(splitvalue[2])
time = str(datetime.datetime.now())

#write and format output to results file
with open("results.txt", "ab+") as f:
    f.write(MAC+" "+SSID+" "+time+"\r\n")

3 个答案:

答案 0 :(得分:2)

如果你的问题归结为:

  

我尝试过使用解码和编码,但仍然对我大吼大叫,split方法无法使用数据类型。

可以通过以下代码证明手头的错误:

>>> blah = b'hello world'  # the "bytes" produced by check_output
>>> blah.split('\n')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a bytes-like object is required, not 'str'

为了拆分bytes,还必须提供bytes个对象。修复只是:

>>> blah.split(b'\n')
[b'hello world']

答案 1 :(得分:0)

正确使用decode():如果要重复使用blah,请分两个步骤进行操作:

blah = blah.decode()
splitblah = blah.split("\n")
# other code that uses blah

或内联(如果您需要一次性使用):

splitblah = blah.decode().split("\n")

您使用decode()时遇到的问题是您没有使用它的返回值。请注意,decode()不会更改对象(blah)来将其分配或传递给某些对象:

# WRONG!
blah.decode()

另请参阅:
decode个文档。

答案 2 :(得分:0)

对于python3,你应该使用这种模式(从python2移过来后)

for line in res2.content.splitlines():
   
    line = line.decode()

你不会得到下面的错误

<块引用>

TypeError: 需要一个类似字节的对象,而不是 'str'