我有一个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
有什么建议吗?
答案 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")