Я написал код с использованием 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)
or
#with a loop over m, like above
fsock = open(infir + filenames[m])
получить ту же ошибку, что и выше.
Странная проблема. Когда я печатаю имена файлов, они верны. И они открываются, ошибки нет. Это синтаксический анализатор, который просто не будет анализировать объектные файлы, даже с filenames[m]
, где m = 0
, конечно, это не должно быть проблемой?
РЕДАКТИРОВАТЬ: Разбор документа с помощью python minidom
в этом посте у них была аналогичная проблема, разрешение было использовать
xmldoc.seek(0)
однако для меня это возвращается
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-ФАЙЛА.
f
/f[m]
/filename[m]
и т. д. на каждой итерации? - person kazbeel   schedule 13.01.2016os.path.join()
(doc) присоединиться к indir и файлу. - person kazbeel   schedule 13.01.2016xml.etree
(doc). - person kazbeel   schedule 13.01.2016