解析存在的XML文件并具有有效文件名的Python OSError 22

问题描述

我正在尝试解析从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')