我有一个Python 3应用程序,它使用元素树模块定期解析数据并将数据写入xml文件(每10秒一次)。
该应用程序在一个几乎从未正常关闭的小型Raspberry系统上运行。它一直打开,如果停电,它会关闭。 有时,当系统重新启动并且python应用程序启动时,它会找到一个空的xml文件。该文件仍在文件系统上,但它完全是空的。 我认为当ET在文件中写入XML树并且系统失去电源时会发生这种情况。我发现ET会在完成时自动关闭写入流。那是对的吗?
我唯一想避免这种情况的想法是定期制作我的文件的镜像副本,并在发现主xml文件为空的情况下将其复制出来......但是有更好的方法可以解决我的问题吗?
回复Parfait:
class XML_timer_prog:
def __init__(self):
self.path = root_dir + 'static/XML/current/'
self.filename = 'timer_prog.xml'
self.tree = ''
self.root = ''
def open(self):
self.tree = ET.parse(self.path + self.filename)
self.root = self.tree.getroot()
return self.root
self.root = self.open()
def update(self, timer, timer_id ):
for t in self.root.iter('timer'):
#here update some entries
self.tree.write(self.path + self.filename, encoding="UTF-8", xml_declaration=True)
return 1
答案 0 :(得分:0)
添加BlackJack所说的,我会导入时间模块并添加一个等于你想要给你的文件名的变量+写日期和时间+文件扩展名。像这样:
导入时间
'''这里的实际代码'''
variable_name =' name_of_file' + time.strftime('%Y%m%d')+' .file_extension'
由于您每10秒钟写一次,因此添加%S可能也更准确。
答案 1 :(得分:0)
BlackJack解决方案对我来说很好,现在我的写呼叫是这样的:
self.tree.write(self.path + self.temp_file, encoding="UTF-8" xml_declaration=True)
shutil.copy(self.path + self.temp_file, self.path + self.filename)
self.filename变量是最终的XML文件。我试了好几次,目前没有丢失XML