编辑: 是的,我有一个与下面的链接类似的问题,但我认为这不是重复的问题,因为不幸的是,答案无法解决我的问题。 How come a file doesn't get written until I stop the program?
我尝试了f=open(file,w)
f.close()
f.flush()
os.fsync(f)
,但没有帮助。另请注意,我正在使用with
语句,该语句应该与Python从with
块退出后会自动关闭文件。
在关闭程序之前,文件仍然没有被写入。
我现在还注意到,这不是我首先想到的Tkinter问题,没有Tkinter GUI便存在该问题。可能与lxml.etree
下面的原始问题
我试图为XML转换器脚本创建一个简单的GUI。
保存文件时出现问题。在我关闭或销毁Tkinter程序之前,该文件不会被写入。谁能解释为什么会发生以及如何解决?我想在Tkinter窗口运行时写文件。
请在下面的代码中找到:
from tkinter import *
import lxml.etree as ET
import tkinter.filedialog as fdialog
def mfileopen():
global xml_file
xml_file = fdialog.askopenfile()
Label(text=xml_file) .pack()
def dropdown_select(selection):
global xslt_file
if selection == "Stylesheet 1":
xslt_file = "stylesheet1.xsl"
elif selection == "Stylesheet 2":
xslt_file = "stylesheet2.xsl"
def convert_xml(xslt_file, input_xml):
dom = ET.parse(input_xml)
xslt = ET.parse(xslt_file)
transform = ET.XSLT(xslt)
newdom = transform(dom)
write_file(newdom)
def write_file(csv_file):
with open("output.csv", "w") as f:
f.write(str(csv_file))
OPTIONS = [
"Stylesheet 1",
"Stylesheet 2",
]
master = Tk()
Label (text="Open XML file and then Choose XSLT Code from the dorpdown menu and press Load XSLT. Finally press Convert XML") .pack()
button = Button(text="Open XML File", width=30, command=mfileopen)
button.pack()
variable = StringVar(master)
variable.set(OPTIONS[0]) # default value
w = OptionMenu(master, variable, *OPTIONS)
w.pack()
button = Button(master, text="Load XSLT", command=lambda: dropdown_select(variable.get()))
button.pack()
button = Button(master, text="Convert XML", command=lambda: convert_xml(xslt_file, xml_file))
button.pack()
master.mainloop()
答案 0 :(得分:1)
您需要f.close()
将文件写入缓冲区刷新到文件中。或者,您可能只想执行f.flush(); os.fsync();
,以便可以继续使用打开的文件句柄循环。
别忘了import os
。
有关更多信息:How come a file doesn't get written until I stop the program?