python gdata,从输出中提取数字

时间:2013-05-14 03:00:52

标签: python gdata

我还是Python的新手,我一直在使用脚本从我的Raspberry Pi中获取系统信息,比如cpu temp等,并将其导入google doc电子表格。我的目标是从输出中提取数字,格式为temp=54.1'C。我需要单独的数字才能随时间绘制数据...

我正在使用:

import gdata.spreadsheet.service
import os
import subprocess
import re

email = 'myemail@gmail.com'
password = 'mypassword'

spreadsheet_key = 'sjdaf;ljaslfjasljdgasjdflasdjfgkjvja'
worksheet_id = '1'

def temp():
   command = "/opt/vc/bin/vcgencmd measure_temp"
   proc = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
   output = proc.stdout.read()
   return output

def main():
   spr_client = gdata.spreadsheet.service.SpreadsheetsService()
   spr_client.email = email
   spr_client.password = password
   spr_client.ProgrammaticLogin()

   dict = {}
   dict['temp'] = temp()

   entry = spr_client.InsertRow(dict, spreadsheet_key, worksheet_id)

if __name__ == '__main__':
      try:
         main()
      except:
         print "Insert Row Failed!"

以上给出了标准结果。我试过修补re.findall(),但无法获得正确的位置或正确的条件组合(r,'/ d +',s和其他东西),以使其仅返回数字54.1 ..我基本上以“插入行失败”结束了

任何指导都将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

您使用re走在正确的轨道上;你最好的选择(假设小数可以是任意的,等等)是这样的:

import re

def temp():
    command = "/opt/vc/bin/vcgencmd measure_temp"
    proc = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
    output = proc.stdout.read()

    # Build the regex. Use () to capture the group; we want any number of
    # digits \d or decimal points \. that is preceded by temp= and
    # followed by 'C
    temp_regex = re.compile(r'temp=([\d\.]*)\'C')
    matches = re.findall(temp_regex, output)   # now matches = ['54.1']

    temp = float(matches[0])
    return temp

正则表达式捕获数字和小数位的任意组合(例如12.34.56将匹配);你可以限制它,如果有必要只允许一个小数位,但如果你可以相信你得到的数据是格式良好的,那么这比看起来更值得。如果你确实希望数字更精确,你可以像这样编译正则表达式(对于小数点前面的至少一个数字,以及它后面的一个数字):

temp_regex = re.compile(r'temp=(\d+.\d)\'C')

同样,我们使用括号捕获表达式(通过findall捕获的组为returned),但这一次,增加了我们正在寻找的特异性。这将捕获任何数字,例如123.4但不是.4而不是123.如果您发现需要将其扩展一点但仍然只需要一个小数位:

temp_regex = re.compile(r'temp=(\d+.\d+)\'C')

这将捕获任意数字,其中至少有一个数字继续并且在小数点后面,因此1234.5678会匹配,但1234.不会,而.1234则不会。

作为使用re.findall()的替代方法,您可以使用返回match objectsre.match()。然后你的用法看起来像这样(使用直接方法,而不是预编译字符串:

match = re.match(r'temp=(\d+.\d+)\'C', output)
if match:
    temp = float(match.group(1))   # get the first matching group captured by ()
else:
    pass   # You should add some error handling here

这比我上面re.findall()的方式更明确的一点是,如果没有捕获任何内容,你就会遇到问题,你需要弄清楚如何处理它。


您可以在Regular-Expressions.info查看其他方法来改变这种情况,这是我在网上找到的最佳网站,可以快速了解该主题。

答案 1 :(得分:0)

好吧,我已经花了太多时间搞乱这个。我似乎无法让output = proc.stdout.read()给我任何东西。我尝试了几十种re的组合而没有运气。

然后我开始查看replace()方法。它可能不是最简单的方法,但我知道输出将始终采用“temp = XX.X'C”(X为数字)的形式,所以我最后这样做了:

def temp():
   command = "/opt/vc/bin/vcgencmd measure_temp"
   proc = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
   output = proc.stdout.read()
   output1 = output.replace("temp=","")
   output2 = output1.replace("'C","")
   return output2

它有效!它会在Google电子表格中显示为我需要的数字。

感谢您的帮助,我会继续尝试在其他应用程序中实现re,也许我会找出为什么我无法使用它。