我还是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 ..我基本上以“插入行失败”结束了
任何指导都将不胜感激。谢谢!
答案 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 objects的re.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
,也许我会找出为什么我无法使用它。