问题描述:最近因为要写一个统计Android手机流量的脚本,写了python代码,代码中用os.popen执行了adb命令并将结果赋值给traffic对象。
使用traffc.read()读取了对象中的字符串后,写了一个循环来获取字符串中的有效数据。
关键代码如下:
traffic=os.popen("adb shell cat /proc/"+pid+"/net/dev")
print(traffic.read())
for line in traffic.readlines():
if "wlan0" in line:
receive=line.split()[1]
transmit=line.split()[9]
elif "rmnet_data0" in line:
receive0=line.split()[1]
transmit0=line.split()[9]
else:
pass
执行后报错为:
UnboundLocalError: local variable 'receive' referenced before assignment
调试后发现,是因为traffic.readlines()这段代码返回了空字符串,导致receive等变量的赋值语句未被执行。变量未声明,下文调用了该变量,提示局部变量reveive未在调用前声明。
print(traffic.read())语句打印出了内容,证明traffic对象是正常存储了字符串内容的。
但第二次访问traffic.readlines()就打印了空字符串。说明存在连续读取两次traffic对象会导致第二次读取返回为空的问题。
针对该问题百度了一下,发现文件读取时,如果连续读取两次,第二次也是为空,原因是第一次读取文件完成后,光标在文件末尾,第二次读取时,光标在末尾读取,自然返回为空。
为重复读取文件时出现此问题,百度给出了解决方案:
第一次读取或者写入,使用f.read或f.write后,使用f.seek(0)将光标移动到最前面,方便下次读取。
但读取对象无法使用该方法。
针对本次traffic对象内容重复读取的问题,traffic对象无法使用seek方法,百度未找到解决方案,建议避免重复读取操作,单次读取,如需重复访问该内容,可将此内容赋值给一个字符串对象。