KeyError при разборе данных из файла. xml - PullRequest
0 голосов
/ 19 января 2020

Я новичок и пытаюсь проанализировать некоторые данные из. xml файлов, структура которых имеет вид, приведенный ниже.

<parking id="pucpr">
  <space id="1" occupied="0">
    <rotatedRect>
      <center x="300" y="207" />
      <size w="55" h="32" />
      <angle d="-74" />
    </rotatedRect>
    <contour>
      <point x="278" y="230" />
      <point x="290" y="186" />
      <point x="324" y="185" />
      <point x="308" y="230" />
    </contour>
  </space>
  <space id="2" occupied="0">
    <rotatedRect>
      <center x="332" y="209" />
      <size w="56" h="33" />
      <angle d="-77" />
    </rotatedRect>
    <contour>
      <point x="325" y="185" />
      <point x="355" y="185" />
      <point x="344" y="233" />
      <point x="310" y="233" />
    </contour>
  </space>
.
.
.
</parking>

В разных папках находятся сотни таких файлов. Я написал код ниже для разбора данных из всех этих файлов. xml.

import xml.etree.ElementTree as ET
import os
import xlsxwriter

data_path = '/Users/jaehyunlee/Desktop/for_test'

# Read full directory and file name in the folder
for path, dirs, files in os.walk(data_path):
    for file in files:
        if os.path.splitext(file)[1].lower() == '.xml': # filtering only for .xml files
            full_path = os.path.join(path, file)

            # Parsing data from .xml file
            tree = ET.parse(full_path)
            root = tree.getroot()

            for space in root.iter('space'):
                car = space.attrib["occupied"]
                car_int = int(car)

Проблема возникает, когда я пытаюсь проанализировать значение атрибута «busy». Когда я запускаю код, он возвращает KeyError: 'busy'. Для других атрибутов, таких как 'x', 'y', 'w', 'h', он работает отлично. Может ли кто-нибудь помочь?

ps. Когда я конвертирую один файл. xml по отдельности, эта ошибка не возникает. Но это происходит, когда я пытаюсь выполнить итерацию для всех файлов в папке.

1 Ответ

1 голос
/ 20 января 2020

Я обнаружил, что эта KeyError произошла из-за того, что некоторые файлы не содержат атрибут «оккупирован». Чтобы избежать этой проблемы и продолжить итерацию, я добавил 'if' в 'for'.

import xml.etree.ElementTree as ET
import os
import xlsxwriter

data_path = '/Users/jaehyunlee/Desktop/for_test'

# Read full directory and file name in the folder
for path, dirs, files in os.walk(data_path):
    for file in files:
        if os.path.splitext(file)[1].lower() == '.xml': # filtering only for .xml files
            full_path = os.path.join(path, file)

            # Parsing data from .xml file
            tree = ET.parse(full_path)
            root = tree.getroot()

            for space in root:
                if 'occupied' in space.attrib:
                    car = space.attrib['occupied'] 
                    car_int = int(car)
...