Python Forum
Diff. between Py 2.7 and 3 - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Diff. between Py 2.7 and 3 (/thread-14749.html)



Diff. between Py 2.7 and 3 - ebolisa - Dec-15-2018

Hi,

The following code gets the wifi quality type on a raspberry pi and works with 2.7 but not with 3.0.

The error generated is

Quote:Traceback (most recent call last):
File "test.py", line 9, in <module>
if line.startswith("Quality"):
TypeError: startswith first arg must be bytes or a tuple of bytes, not str

The startswith method used is correct based on the manual
str.startswith(str, beg = 0,end = len(string));
so, not sure where the error is.

I appreciate some insights.
TIA

from subprocess import check_output

'''get wifi connection printout'''
scanoutput = check_output(["iwlist", "wlan0", "scan"])

'''separate bytes'''
for line in scanoutput.split():
  '''filter the quality line out'''
  if line.startswith("Quality"):
     '''remove text from it'''
     level = line.split('=')[1]
     '''get the divisor'''
     lev0 = float(level.split('/')[0])
     '''get the divident'''
     lev1 = float(level.split('/')[1])
     '''devide and multiply by 100 to get the %'''
     cal = int(lev0 / lev1) * 100
     print("{}%".format(str(cal)))



RE: Diff. between Py 2.7 and 3 - snippsat - Dec-15-2018

Received data a for check_output() will be bytes,so need to decode() to string.
Example:
>>> s = b'Quality is good'
>>> if s.startswith('Quality'):
...     print('True')
...     
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
TypeError: startswith first arg must be bytes or a tuple of bytes, not str

>>> # Fix
>>> s = s.decode() #same as s.decode('utf-8')
>>> if s.startswith('Quality'):
...     print('True')
...     
True



RE: Diff. between Py 2.7 and 3 - ebolisa - Dec-15-2018

Fixed it, Thank you!!