본문 바로가기

Computer Science/Python

[Python] 파이썬 XML 데이터 읽기

반응형

혹시 간단하게 dict 타입으로 변환해서 처리하고 싶다면 다음 글을 참고하세요.(개인적으로 추천)

 

https://yeslab.tistory.com/142

 

[Python] 파이썬 XML을 사전(json)으로 쉽게 처리하기(xmltodict)

이전에 작성 했던 파이썬에서 XML 데이터 읽기의 글이 요즘들어 조회수가 높게 나오는 편인데 사실 나도 이제 저렇게 xml 패키지를 사용하지 않아 업데이트의 필요성을 느껴 추가로 작성 한다. 혹

yeslab.tistory.com

 

아래글은 ElementTree 오브젝트로 읽어 처리하는 방법입니다.


 

2019-07-18 작성 내용

 

빅데이터 관련 업무를 하다보면

TSV(Tab Separated Value), XML(Extensible Markup Language), JSON(JavaScript Object Notation)

이 3가지의 형태의 데이터를 자주 접하게 된다.

 

TSV나 JSON의 경우 Dictionary로 읽으면 매우 쉽지만

XML의 경우 Tree 형식으로 구성되어 있기 때문에 엑세스가 편하지 않다.

그렇다면 왜 아직까지 XML을 쓴는 것일까.....

대충 검색해봤을때는 Namespace 등 Json보다는 로직적으로 구현가능한 내용이 많아서 같다.

 

업계에서도 요즘은 대체로 유연한 JSON을 사용한다.

나 또한 Python으로는 다루기 쉬운 JSON을 주로 활용한다.

 

아무튼 가끔 XML 관련 작업을 해야할 때 참고하기 위해 정리한다!

 

Python에서 XML을 Parsing하면 EelementTree 형태가 된다.

 

Elemnet Object에 대해서 먼저 알아보자

tag : 어떤 데이터를 표현하는지에 대해 서술 (element type이라고도 한다)

text

tail : element와 관련된 추가적인 데이터를 저장한다.

attrib : 

 

이런 Element Object가 Tree 형태로 있다고 보면 된다.

그렇게 때문에 기본적으로 Tree를 탐색하는 방법으로 데이터를 찾는다고 보면 된다.

보통 Iteration으로를 통해 Children element들을 Fully Access한다.

Nested 된 Tree의 경우 이는 매우 비효율 적이기 때문에 적절히 tag 등을 확인하여 적절히 최적화를 해주는 것이 좋다.

 

Example Data

 

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

 

1. File에서 읽는 방법

import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()​

2. String을 읽는 방법

root = ET.fromstring(country_data_as_string)

ElementTree 형태에서 root는 tag와 attributes dictionary 를 갖는다.

>>> root.tag
'data'
>>> root.attrib
{}

 

3. for loop을 통해 iteration 하는 예시

for child in root:
     print(child.tag, child.attrib)

country {'name': 'Liechtenstein'}
country {'name': 'Singapore'}
country {'name': 'Panama'}

 

3. iter method를 활용한 iteration 예시

for neighbor in root.iter('neighbor'):
     print(neighbor.attrib)

{'name': 'Austria', 'direction': 'E'}
{'name': 'Switzerland', 'direction': 'W'}
{'name': 'Malaysia', 'direction': 'N'}
{'name': 'Costa Rica', 'direction': 'W'}
{'name': 'Colombia', 'direction': 'E'}

 

4. index를 이용한 예시

 

>>> root[0][1].text
'2008'

 

5. findall method 활용

>>> for country in root.findall('country'):
...     rank = country.find('rank').text
...     name = country.get('name')
...     print(name, rank)
...
Liechtenstein 1
Singapore 4
Panama 68
반응형