본문 바로가기

Python 프로그래밍

파이썬 프로그래밍 Json / XML 제어 하기

 

이번 본문에서는 파이썬 프로그래밍 에서 파일저장부분을 설명할건데 가장 유명한 json 파일 형식과 xml 파일 형식 두가지를 알아볼것이다.

 

json 파일

 

JSON은 2009년에 더글라스 크록포드(Douglas Crockford)가 처음으로 규정되어서,

현재 JSON은 RFC 7159와 ECMA-404라는 두 개의 경쟁 표준에 의해 규정되고 있습니다.

ECMA 표준에서는 문법만 정의할 정도로 최소한의 정보만 정의되어 있으며, RFC 표준은 문법 및 보안에 관련된 사항까지 일부 제공하고 있습니다.

 

json 파일은 기본적으로 텍스트로 이루어져 있어서 기계와 사람 모두 읽고 쓰기 쉽고 프로그래밍 언어와 플랫폼에 독립적이라서 서로 다른 시스템간에 객체를 교환하기 좋아서 자주 쓰인다

 

무슨 말이고 하니, 텍스트파일로 이루어져 있어서 c 나, c++, c#, java , javascript, perl, python같은 프로그래밍 언어에 완벽하게 독립적으로 되어 있어서, 어느 프로그래밍 언어에서나 쉽게 읽고 쓸수 있다는 것이다. 이렇게

완벽하게 독립적으로 이루어져있지만, 프로그래머들에게 아주 친숙한 관습을 사용해서, 사용을 매우 편하게 한다.

 

json은 name/value 쌍으로 된 컬렉션의 구조로 이루어지는데 이건 다양한 프로그래밍 언어에서 object, record, struct, dictionary, hash table, keyed list, 또는 associative array 로 불러올수 있다.

 

이 name/value 쌍으로 된 컬렉션을 쭉 나열함으로써, 다른 언어들에서 array, veactor, list , 또는 sequence로 사용할수 있다.

 

이러한 유니버셜한 data구조를 가져서 사실상 현존하는 모든 프로그래밍 언어들에서 어떠한 형태든 이것들을 지원할수있는것이다. 따라서 프로그래밍 언어들은 이러한 json파일을 쉽게 읽고 쓸수있게 하는 것이다.

 

object는 name/value 쌍들의 비순서화된 set으로 중괄호({})의 안에 들어가서 표현한다. 

 

각 name 뒤에 콜론(:) 을 붙이고 콤마(,)로 name/value 쌍들간을 구분한다.

 

"id": "1",
"name": "hub_ja_top_nock",
"rate": "80",
"enable": true
 

 

array는 순서화 된 collection으로써, 대괄호([])로 표현하고, 콤마(,)로 array값들을 서로 구분할수있다.

"ST20":[
   {
        "id": "1",
        "name": "hub_ja_top_nock",
        "rate": 80,
        "enable": true
   },
   {
        "id": "2",
        "name": "hub_ja_top_neck_scratch",
        "rate": 80,
        "enable": true
   }
]
 

value는 큰따움표(") 안에 string ,number, true ,false ,null , object, array등이 올수 있다.

위에 json파일 예시를 들자면, "ST20"이라는 name에 value값을 array을 주어서 여러값들을 가지게 한 구조가 이루어지고 또 그 안에 name / value 컬렉션에서 큰따움표("")로 string값을 주기도 하고 바로 숫자값이나 true, false등을 줄수 있다는 걸 알수있다.

 

 

string은 큰따움표("")안에 둘러싸인 유니코드 문자들의 조합으로 이루어지면, 쌍따움표로 감싸주어야 된다. 이때, 하나의 문자(charater)도 하나의 문자열(character string)으로 표현되게 된다 이 string은 c나 java, 파이썬 프그래밍 언어의  string과 매우 유사하다.거의 똑같다고 보면 된다 그래서 코드에서 그냥 바로 받아서 쓸수있다.

number(숫자)도 8진수와 16진수를 사용하지 않는걸 제외하고는 c나 java, 파이썬 프로그래밍 언어의 숫자와 매우 비슷하다. 이것도 역시 코드에서 그냥 바로 받아오면 된다.

 

이제 파이썬 프로그래밍 에서 코드로 표현하자면,

 

아래와 같이 표현하면 된다.

 

예시를 표현하기 위해 파일이름이 saveparam.json으로 되어 있고, 인코딩이 utf-8로 되어있는걸로 가정한다.

 

json라이브러리를 인포팅하고

 

 

json 파일 읽기

 

모델번호를 받아와서 위에 ReadList함수를 호출하게 되면 idn이라는 변수에 name이 id로 된 value값을 저장하고

per에서는 rate이라는 name의 value값을 100으로 나눠서 퍼센트를 숫자로 변환해서 저장. 그리고 enable이라는 변수에는 enable이라는 name의 value값을 찾아서 저장한다.

 

이처럼 for문을 통해 [modelpdt][MachineNo] 항목을 saveparam.json파일에서 검색을 하여 그값을 이제 파이썬에서 불러다 쓸수있는 것이다.

 

json 파일 쓰기

 

json 파일 을 쓰는 방법을 대충 설명하면 아래와 같이 예를 들수있는데, 맨위에 딕셔너리 형태로 구조를 만들어서

딕셔너리안에 딕셔너리 modelpdt파일을 만들고 그 modelpdt파일 안에 name은 "id"로 value는 "1"로

name은 "rate"으로 value는 0.90인 숫자값으로 해서 파일을 쓰는것이다.

이런식으로 응용해서 json파일을 읽고 쓸수 있다.

 

이제 다음으로 json만큼이나 많이 쓰는 파일 저장플랫폼인 xml에 대해 설명한다.

 

 

xml 파일 

 

W3C에서 개발된,  HTML과 매우 비슷한 문자 기반의 마크업 언어(text-based markup language)입니다.

이 언어는 사람과 기계가 동시에 읽기 편한 구조로 되어 있습니다.

그러나 HTML처럼 데이터를 보여주는 목적이 아닌, 데이터를 저장하고 전달할 목적으로만 만들어져서

HTML 태그처럼 미리 정의되어 있지 않고, 사용자가 직접 정의할 수 있습니다

 

PC는 그냥 복잡한 계산기에 불과하므로 XML과 같은 구조화된 마크업 언어들은 인간의 읽고 분석하여 이해하는 능력과 pc의 심플한 판독 능력 사이에 타협점을 만들어 줄 수 있습니다. 

 

xml에 관한 정의는 W3C가 만든 XML 1.0 Specification과 몇몇 다른 관련 명세들, 모든 자유 개방형 표준에서 정의 되어 있습니다.

 

W3C는 xml 설계 목표에서 단순성과 일반성, 그리고 인터넷을 통해 사용할수 있도록 가볍게 사용 할수 있음을 강조했습니다. 이러한 xml은 json과 마찬가지로 텍스트 형식으로 유니코드문자열을 사용해서 전 세계 모든 언어를 지원하고 XML을 설계할 때는 주로 문서를 만드는데 집중했지만 , 지금은 다양한 자료구조를 나타내는 데 주로 쓰입니다. 대표적인 예가 웹 서비스라고 할수있습니다.

 

이처럼 xml 데이터를 처리하는데 다양한 언어들의 많은 api가 개발되어 있어서, 프로그래머들이 손쉽게 사용하고, 여러가지 스키마도 되어 xml 기반 언어의 정의 쉽게 할수있게 합니다.

 

xml의 구성요소는 아래 표를 참고하시면 되고.

 
구성요소 
설명
Element(앨리먼트)
마크업 태그와 그안에 포함된 내용
Empty Element
데이터와 같은 내용을 포함하지 않은 엘리먼트
Root Element(루트요소)
문서내 모든 엘리먼트와 내용을 포함하고 있는 XML 문서의 엘리먼트
Attribute(속성)
엘리먼트에 포함되어 추가적인 정보를 제공
Entity(엔터티)
텍스트, Binary 데이터, 비 ASCII 문자를 저장하는데 사용
Processing Instruction
전체 문서나 문서의 일부를 처리하는 응용 프로그램과 연결해 주는 명령어
주석
XML 프로세서가 해석하지 않는 설명문
CDATA 섹션
특수한 문자를 일반 텍스트로 인식하도록 하는 표기법 

이러한 xml은 아래와 같이 트리 구조를 가지는데 

 

 

<?xml version="1.0"?>

<!DOCTYPE compactdiscs SYSTEM "cds.dtd">

<compactdiscs>

  <compactdisc>

    <artist type="individual">Frank Sinatra</artist>

    <title numberoftracks="4">In The Wee Small Hours</title>

    <tracks>

          <track>In The Wee Small Hours</track>

          <track>Mood Indigo</track>

          <track>Glad To Be Unhappy</track>

          <track>I Get Along Without You Very Well</track>

    </tracks>

    <price>$12.99</price>

  </compactdisc>

  <compactdisc>

    <artist type="band">The Offspring</artist>

    <title numberoftracks="5">Americana</title>

    <tracks>

           <track>Welcome</track>

           <track>Have You Ever</track>   

           <track>Staring At The</track>

           <track>Pretty Fy (For A White Guy)</track>

    </tracks>

    <price>$1.99</price>

  </compactdisc>

</compactdiscs>
 

즉 예를 들면 위와 같이 된다는 뜻입니다.

 

이러한 xml문서자체를 이제 파이썬 프로그래밍 에서 읽고 쓰고 하려면 라이브러리를 etree에서 제공한게 그나마 제일 유명하고 쓰기 편합니다.

 

인포팅자체를 

 

위에 그림 처럼 xml.etree.ElementTree라는 이름이 너무 기니 ET라는 이름으로 치환해서 쓰고

 

읽고 쓸때 위의 API를 사용해서 읽고 쓰면 됩니다.

 

이 xml은 루트가 있고 차일드가 있으므로 그것의 구조를 잘 들어가고 잘 붙여넣어야됩니다. 순서가 다 있으므로 수정할때는 기존 경로를 다 가져와서 붙여놓고 수정해야 되는 단점이 있습니다.

 

 

이제 본격적으로 파이썬 프로그래밍에서 xml 파일 읽기 / xml 파일 쓰기를 예를 들면,

 

xml 파일 읽기

 

위에 함수 처럼 et.parse로 파일이름을 읽어서 doc이라는 변수에 저장해서 doc.getroot()함수를 호출해서 루트를 가져오고 루트에서 "images"를 찾고 거기서 iter로 순회하면서 attribute값들을 가져올수 있게합니다.

 

 

xml 파일 쓰기

 

이번에는 xml파일 쓰기를 할건데 이것도 읽기와 유사하게 우선 구현하자면, 물론 이제 파일 구조가 복잡해지면 하는것도 복잡해지는데 그건 예시에 안들겠습니다.

 

 

 

역시 마찬가리고 ET.parse로 파일을을 읽고 dump로 xml 파일 구조를 덧붙인다음 doc.write함수로 파일을 새로 습니다. 

 

 

 

 

 

반응형