Python Minidom 解析文件对象
Python Minidom Parsing File Objects
我使用 minidom 编写了一个代码,它采用 xml
脚本,将其作为文件对象打开,然后解析该文件对象。不仅如此,我还希望脚本可以打开一个文件夹中的多个文件,然后分别解析每个文件。
xml
脚本的一个例子是:
<?xml version="1.0"?>
<Data>
<data1>1</data1>
<data2>2</data2>
<data3>3</data3>
<Sub_data>
<sub_data1>0.1111111111111</sub_data1>
<sub_data2>0.2222222222222</sub_data2>
... and so on.
也就是说,它非常标准。
现在,我的代码如下所示:
import os
import io
from xml.dom import minidom
#folder where xml files are located
indir = '/foo/bar/docs/'
masterlist = []
for root, dirs, filenames in os.walk(indir):
for f in filenames:
row = []
fsock = io.open(indir + f, mode = 'rt', encoding = 'cp1252')
xmldoc = minidom.parse(fsock)
...
我得到的错误是:
Traceback (most recent call last): File "kgp_2.py", line 34, in
<module> xmldoc = minidom.parse(fsock) File
"/usr/lib/python2.7/xml/dom/minidom.py", line 1918, in parse return
expatbuilder.parse(file) File
"/usr/lib/python2.7/xml/dom/expatbuilder.py", line 928, in parse
result = builder.parseFile(file) File
"/usr/lib/python2.7/xml/dom/expatbuilder.py", line 211, in parseFile
parser.Parse("", True) xml.parsers.expat.ExpatError: no element found:
line 203, column 1381
现在,当我进行更改时:
fsock = io.open(indir + filenames[0], mode = 'rt', encoding = 'cp1252')
这很好用,也就是说,它打开了文件夹中的第一个文件;但我想解析文件夹中的所有文件。当我做一个循环时:
m = 0
... in loop:
fsock = io.open(indir + filenames[m], mode = 'rt', encoding = 'cp1252')
...
m = m+1
我得到了原来的错误。
我之所以使用 io 库而不是通常的文件打开函数是因为之前的一篇堆栈溢出文章推荐了它。使用:
fsock = open(indir + filenames[0])
和以前一样,没有错误,但是:
fsock = open(indir + f)
或
#with a loop over m, like above
fsock = open(infir + filenames[m])
得到与上面相同的错误。
奇怪的问题。当我打印文件名时,它们是正确的。他们正在被打开,那里没有错误。是解析器不会解析目标文件,即使 filenames[m]
where m = 0
,这应该没问题吧?
编辑:
Parsing document with python minidom
在这个post他们遇到了类似的问题,解决方案是使用
xmldoc.seek(0)
然而,对我来说这个returns
Traceback (most recent call last):
File "kgp_2.py", line 45, in <module>
xmldoc.seek(0)
AttributeError: Document instance has no attribute 'seek'
编辑 2:已解决。这是一个损坏的输入案例 XML 文件。
您确定所有 XML 文件中包含的 XML 数据都是正确的吗?也许一个是空的,你必须处理这样的异常。无论如何我建议你使用 xml.etree
doc.
我使用 minidom 编写了一个代码,它采用 xml
脚本,将其作为文件对象打开,然后解析该文件对象。不仅如此,我还希望脚本可以打开一个文件夹中的多个文件,然后分别解析每个文件。
xml
脚本的一个例子是:
<?xml version="1.0"?>
<Data>
<data1>1</data1>
<data2>2</data2>
<data3>3</data3>
<Sub_data>
<sub_data1>0.1111111111111</sub_data1>
<sub_data2>0.2222222222222</sub_data2>
... and so on.
也就是说,它非常标准。
现在,我的代码如下所示:
import os
import io
from xml.dom import minidom
#folder where xml files are located
indir = '/foo/bar/docs/'
masterlist = []
for root, dirs, filenames in os.walk(indir):
for f in filenames:
row = []
fsock = io.open(indir + f, mode = 'rt', encoding = 'cp1252')
xmldoc = minidom.parse(fsock)
...
我得到的错误是:
Traceback (most recent call last): File "kgp_2.py", line 34, in
<module> xmldoc = minidom.parse(fsock) File
"/usr/lib/python2.7/xml/dom/minidom.py", line 1918, in parse return
expatbuilder.parse(file) File
"/usr/lib/python2.7/xml/dom/expatbuilder.py", line 928, in parse
result = builder.parseFile(file) File
"/usr/lib/python2.7/xml/dom/expatbuilder.py", line 211, in parseFile
parser.Parse("", True) xml.parsers.expat.ExpatError: no element found:
line 203, column 1381
现在,当我进行更改时:
fsock = io.open(indir + filenames[0], mode = 'rt', encoding = 'cp1252')
这很好用,也就是说,它打开了文件夹中的第一个文件;但我想解析文件夹中的所有文件。当我做一个循环时:
m = 0
... in loop:
fsock = io.open(indir + filenames[m], mode = 'rt', encoding = 'cp1252')
...
m = m+1
我得到了原来的错误。
我之所以使用 io 库而不是通常的文件打开函数是因为之前的一篇堆栈溢出文章推荐了它。使用:
fsock = open(indir + filenames[0])
和以前一样,没有错误,但是:
fsock = open(indir + f)
或
#with a loop over m, like above
fsock = open(infir + filenames[m])
得到与上面相同的错误。
奇怪的问题。当我打印文件名时,它们是正确的。他们正在被打开,那里没有错误。是解析器不会解析目标文件,即使 filenames[m]
where m = 0
,这应该没问题吧?
编辑: Parsing document with python minidom
在这个post他们遇到了类似的问题,解决方案是使用
xmldoc.seek(0)
然而,对我来说这个returns
Traceback (most recent call last):
File "kgp_2.py", line 45, in <module>
xmldoc.seek(0)
AttributeError: Document instance has no attribute 'seek'
编辑 2:已解决。这是一个损坏的输入案例 XML 文件。
您确定所有 XML 文件中包含的 XML 数据都是正确的吗?也许一个是空的,你必须处理这样的异常。无论如何我建议你使用 xml.etree
doc.