问题描述
我正在尝试解析从Bricklink网站导出的一个或多个XML文件。我正在通过defusedxml ElementTree系统打开文件。
我尝试打开的每个文件都会在尝试打开时出现OSError 22,即使文件名似乎是有效的-我也可以使用其他工具打开文件并查看其内容。
跟踪为:
Traceback (most recent call last):
File "C:\Users\Jason\AppData\Local\Programs\Python\python38\lib\tkinter\__init__.py",line 1883,in __call__
return self.func(*args)
File "D:/Jason/Projects/Projects/wantedlist_modder.py",line 48,in processfiles
tree = ET.parse(filename)
File "C:\Users\Jason\AppData\Local\Programs\Python\python38\lib\site-packages\defusedxml\common.py",line 105,in parse
return _parse(source,parser)
File "C:\Users\Jason\AppData\Local\Programs\Python\python38\lib\xml\etree\ElementTree.py",line 1202,in parse
tree.parse(source,line 584,in parse
source = open(source,"rb")
OSError: [Errno 22] Invalid argument: "'D:/Jason/Downloads/LF_LtN_2020.xml'"
python代码如下:
from tkinter import messageBox,filedialog
import tkinter as tk
from defusedxml.ElementTree import *
import defusedxml.ElementTree as ET
import io
class Application(tk.Frame):
def __init__(self,master=None):
super().__init__(master)
self.master = master
self.pack()
self.create_widgets()
def create_widgets(self):
self.pack(padx = 20,pady = 20)
frame = Frame(self)
frame.pack(side = TOP)
# create variable for input field
self.filename = tk.StringVar()
self.filename.set("")
# create input field
self.inputfile = tk.Entry(frame)
self.inputfile.pack(side = LEFT)
self.inputfile["textvariable"] = self.filename
# create browse button
self.browse = tk.Button(frame,text = "browse...",command = self.openbrowse)
self.browse.pack(side = LEFT)
# create process button
self.process = tk.Button(self,text = "Process",command = self.processfiles)
self.process.pack(side = TOP,padx = 20,pady = 20)
# create quit button
self.quit = tk.Button(self,text = "QUIT",fg = "red",command = self.master.destroy)
self.quit.pack(side = BottOM)
def openbrowse(self):
filenames = tk.filedialog.askopenfilenames(title = 'select',filetypes = [("XML",".xml"),])
if not filenames is None:
self.filename.set(','.join(repr(u) for u in filenames))
def processfiles(self):
print("Roger,roger!")
filenames = tuple(self.filename.get().split(','))
showdone = 0
for filename in filenames:
try:
print(filename)
tree = ET.parse(filename)
showdone = 1
except FileNotFoundError:
tk.messageBox.showinfo("Wanted List Modder","Please enter a valid filename")
if showdone:
tk.messageBox.showinfo("Wanted List Modder","Done!")
root = tk.Tk()
app = Application(master=root)
app.mainloop()
我已经进行了很多尝试来解决此问题,但是我在本网站或其他地方找到的所有修复候选者似乎都没有改变(例如,我从文件而不是字符串中进行解析)。我不确定内容是否有问题,这似乎与文件名有关-或我将其传递给解析函数的方式。它确实会打印正在处理的文件的名称,而我正在使用“浏览”按钮系统来查找文件。我知道这会导致从元组转换为元组的一些额外处理,但我不认为这是罪魁祸首,因为传递给解析的变量值是字符串。
请在Windows 7-x64计算机上运行带有defusedxml 0.6.0的Python 3.8.6 ...,并非常希望帮助您确定OSError的原因。
在此先感谢您-道歉!我已经有一段时间没有使用Python了,我正在与化学的不良神经系统作用作斗争...
解决方法
请参见下文-文件名中还有"
# your code with a bug
try:
with open('"c:/temp/a.xml"','rb') as f:
pass
except OSError:
print('we have a problem')
# bug was removed - it works
with open('c:/temp/a.xml','rb') as f:
print('it works')