错题集-重复读取read

问题描述:最近因为要写一个统计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方法,百度未找到解决方案,建议避免重复读取操作,单次读取,如需重复访问该内容,可将此内容赋值给一个字符串对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值