Python R / W设备状态为文件

时间:2015-10-21 04:21:13

标签: python

我有一个Python文件,它接受参数-i light1.1 然后解析一个stats文件,看看当前状态是1还是0。 python文件需要比较该值,然后不做任何操作或更改值并将其写回同一文件。

统计档案

ligth1=1
light2=0
light3=1

localpub.py文件

def main(argv):
  try:
    opts, args = getopt.getopt(argv, "i:h") # Compulsary argument of -i for PHP communication
  except getopt.getoptError:
      print "com.py -i <device.state>"  # Help option print out
      print "or -h for help"
      sys.exit(2)
for opt, arg in opts:
    if opt == "-i":     
        request = arg.split(".")
        with open("stats", "r+") as openFile:   # Temp opens stat file
            for line in openFile:
                if request[0] in line: # Test if requested actuator exist in stats file
                    status = line.rstrip("\n").split("=")   
                    if request[1] == status[1]:
                        print "Same state; Do nothing"
                        break
                    elif int(request[1]) == (1-int(status[1])):
                        print "Diff states! Toggling"
                        newState = status[0] + "=" + request[1] + "\n"
                        print newState
                        openFile.write(newState) # This line deletes the file


if __name__ == "__main__":
    main(sys.argv[1:])      # Runs main function, skips 1st arg as that is the py script name

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

此:

with open("stats", "wr") as file:

绝对是错的。流文档说明使用'r''w''a',可选后缀为'+'和/或后缀为'b'。字符串'wr'不是这些。

使用python 2.7进行测试表明,至少在我的系统上,此open调用会打开文件进行编写,立即破坏任何现有内容。

(名称file通常也不是一个好主意,因为它会影响现有的全局类型名称。)

修复此问题后,您将遇到第二个问题,即在读取流和写入流之间切换,您必须执行搜索操作。请参阅,例如this question及其答案。

答案 1 :(得分:0)

大多数帖子都说最好将临时文件与现有文件合并。

第一个with语句找到要解析所请求设备当前状态的匹配行。

第二个with语句将整个文件写入临时文件。

最后copyfile用修改后的新文件替换现有文件。

with open("stats") as files:
    for lines in files:
        if arg in lines:
            status = lines.rstrip("\n").split("=")
            break
toggledInt = 1-int(status[1])
# ADD NEWLINE BACK INTO FILE    
temp = open("temp", "w")
    with open("stats") as opened:
        for liner in opened:
            if arg in liner:
                temp.write(newLine)
            else:
                temp.write(liner)
temp.close()
shutil.copyfile("temp","stats")