파이썬에서 사용할 수 있는 BeautifulSoup을 이용해 xml 데이터를 sqlite3 DB에 넣는 툴을 만들는 간단한 예입니다.

1. BeautifulSoup 다운로드 및 설치
필요한 파일은 BeautifulSoup 사이트에서 다운로드 받으실 수있습니다. 파이썬 버젼이 2.*이면 3.0* 버젼을 3.*이면 3.1* 버젼중 최신버젼을 다운로드 받습니다. 다운로드가 완료되면 압축을 풀고 터미널에서 아래와 같이 setup.py를 실행합니다.

>python ./setup.py install

2. BeautifulSoup 사용예
1) 셈플 xml 파일 (test.xml)
테스트를 위해 간단히 작성해본 XML 입니다.
<?xml version='1.0' encoding='UTF-8'?>
<alcohol>
    <cate1 tt="술">
        <cate2 tt="소주">  
            <item>참이슬</item>
            <item>처음처럼</item>
            <item>잎새주</item>
        </cate2>   
        <cate2 tt='맥주'>  
            <item>카스</item>
            <item>라거</item>
            <item>하이트</item>
        </cate2>   
    </cate1>    
    <cate1 tt="안주">  
        <cate2 tt="고가">
            <item>회</item>
            <item>등심</item>
            <item>양곱창</item>
        </cate2>
        <cate2 tt="저가">
            <item>참치캔</item>
            <item>날계란</item>
            <item>새우깡</item>
        </cate2>
    </cate1>   
</alcohol>

2) 파이썬 소스파일 (con_data.py)
  1. #!/usr/bin/python
  2. #  -*- coding: utf-8 -*-
  3.  
  4. import sys
  5. import sqlite3
  6. from BeautifulSoup import BeautifulStoneSoup
  7.  
  8. argCount = len(sys.argv)
  9. if argCount is not 3:
  10.     print 'Usage:con_data.py [xml file] [db file]'
  11.     sys.exit(0)
  12.  
  13. xml_file = sys.argv[1]
  14. db_file = sys.argv[2]
  15.  
  16. #XML open
  17. src = open(xml_file)
  18. soup = BeautifulStoneSoup(src)
  19.  
  20. #DB & Table create
  21. db = sqlite3.connect(db_file)
  22. cursor = db.cursor()
  23.  
  24. cursor.execute("CREATE TABLE item(cate1, cate2, name)");
  25.  
  26. #Insert data
  27. for cate1 in soup.alcohol('cate1'):
  28.     query1 = 'INSERT INTO item VALUES("' + cate1['tt'] + '", "'
  29.     print 'CATE1: ' + cate1['tt']
  30.    
  31.     for cate2 in cate1('cate2'):
  32.         query2 = query1 + cate2['tt'] + '", "'
  33.         print   '\tcate2: ' + cate2['tt']
  34.      
  35.         for item in cate2('item'):
  36.             query3 = query2 + item.string + '")'
  37.             print '\t\t' + item.string
  38.  
  39.             cursor.execute(query3)
  40.     print "---------------------"
  41.  
  42. #Close
  43. cursor.close()
  44. db.commit()
  45. db.close()

3) 테스트
아래와 같이 실행하면 test.db가 생성되어 있음을 확인하실 수 있습니다.


해당 사이트에서 문서 페이지를 읽어 보시면 보다 세부적인 기능과 상세한 사용법을 확인하실 수  있습니다.  사용한 con_data.py외 test.xml은 압축하여 첨부하였습니다. 테스트 시에는 터미널에서 chmod +x ./con_data.py로 실행권한을 설정하셔야 합니다.



python에서 sqlite3를 사용하는 샘플입니다. mysql등 다른 데이터베이스를 사용하는 방법과 동일하며 간단한 스크립트이기 때문에 보시면 쉽게 이해가 되실 것입니다.

#!/usr/bin/python
#  -*- coding: utf-8 -*-

import sqlite3

# DB 연결
db = sqlite3.connect("test.db")
cursor = db.cursor()

datas = [(1, "cheetah"), (2, "puma"), (3, "leopard")]

# 테이블 생성
cursor.execute("create table animal (no, name)")

# 데이터 INSERT
cursor.executemany("insert into animal values (?, ?)", datas)

# 최종 INSERT된 rowid 출력
print 'Last rowid: ' + str(cursor.lastrowid)
# Row count 출력
print 'Row count: ' + str(cursor.rowcount)

# 쿼리
cursor.execute("select * from animal")
for row in cursor:
    print row[1]

cursor.execute("update animal set name='jaguar' where no=3");

cursor.execute("select * from animal")
print cursor.fetchall()

cursor.execute("select * from animal where no=1")
row = cursor.fetchone()
print 'No 1 is ' + row[1];

# 종료
cursor.close()

db.commit()
db.close()

스크립트를 실행하면 아래와 같이 출력되는 것을 확인하실 수 있습니다.


간혹 euc-kr로된 파일들을 utf-8로 변경할 경우가 있어 파이썬으로 아래와 같이 iconv를 이용하는 간단한 스크립트를 만들어 사용했습니다.

#!/usr/bin/python

import os, sys

for arg in sys.argv[1:]:
    if os.path.isfile(arg):
        os.rename(arg, arg + '.chg')
        command = 'iconv -f euc-kr  -t utf-8 ' + arg + '.chg' + ' > ' + arg
        os.system(command)

파이썬 인자관리의 편리한 기능으로 위와 같이 단순한 코드로도 '*.txt'나 '*'와 같은 와일드카드도 자동으로 처리되어 별다른 불편함 없었습니다.

그런데 이번에는 반대로 utf-8을 euc-kr로 변경할 경우가 생겨 스크립트를 변경하면서 옵션을 추가하여 보았습니다. 몇 번 사용해 보았는데 별 문제가 없어 올려 봅니다. (오류나 잘못된 부분이 있으면 알려주시면 감사하겠습니다. ^^;;) 기본 사용법은 아래와 같습니다.

사용자 삽입 이미지

1) 옵션
  • -h: 위와 같은 사용법을 출력합니다.
  • -r: 서브디렉토리의 파일들도 변환합니다.
  • -f: 디렉토리가 아닌 인자로 넘어 온 파일들을 변경합니다.
  • -x: 이전 파일의 백업파일을 남기지 않습니다.
  • -d: 작업 디렉토리를 지정합니다.
  • -s: 이전 파일을 백업할 파일 확장자를 지정합니다.
  • -e: 변경할 파일의 확장자를 지정합니다.
  • -o: 변경될 파일의 현재 문자셋을 지정합니다.
  • -n: 변경될 문자셋을 지정합니다.

-f는 파일 단위로 -d는 디렉토리 단위로 변환하며, 두 옵션을 같이 사용할 수 없습니다. 현재 파일의 문자셋은 euc-kr로 변경될 문자셋은 utf-8이 기본으로 설정되어 있습니다. -d 옵션에선 사고(?)를 방지하기 위해 변경될 파일의 확장자가 'txt'가 기본으로 설정되어 있으며, 이는 -e[확장자] 옵션으로 변경할 수 있습니다.

이전 파일은 [파일명].chg로 동일 디렉토리에 저장되며, 이 확장자는 -s[확장자] 옵션으로 변경할 수 있습니다. -x 옵션을 사용하면 이전 파일을 저장하지 않습니다.

2) 사용예
* 현재 디렉토리의 data.txt 파일 변경 (euc-kr -> utf-8)
$ chgchar -f data.txt

* 현재 디렉토리의 data.txt 파일 변경 (utf-8 -> euc-kr)
$ chgchar -outf-8 -neuc-kr -f data.txt

* 현재 디렉토리의 *.txt 파일 변경
$ chgchar -f *.txt

* test 디렉토리 내의 모든 txt 파일 확장자를 가진 모든 파일 변경
$ chgchar -d./test -etxt

* 현재 디렉토리 내의 모든 파일과 서브 디렉토리의 파일도 변경
$ chgchar -r -e* -d./

3) 주의사항
파일을 변경하는 위험한(?) 작업인데 테스트와 사용횟수가 부족하기 때문에, 아래의 사항에 유의하시면서 사용하셔야 합니다.
  • 백업파일을 저장하지 않는 '-x' 옵션 사용하지 않는 것이 좋습니다.
  • 와일드카드(*)는 가능한 사용하지 않는 것이 좋습니다.
  • 대상 디렉토리와 파일을 확인하고 실행해 주세요.

4) 다운로드
아래의 압축파일을 다운로드 받아서 압축을 푸시고 'chmod +x ./chgchar'로 파일의 실행권한을 추가하시고 사용하시면 됩니다.

* 2008.10.21 추가
"nakada님으로 부터 파일 접근권한을 설정하지 않은 문제가 있는 것을 알게되었습니다. 자세한 내용은 nakada님의 포스팅을 참조하시기 바랍니다. nakada님이 작업하신 내용은 이곳에서도 변경해 놓았습니다. nakada님께 감사 드립니다. ^^"



* 아래의 'more..'를 클릭하시면 스크립트의 내용을 확인하실 수 있습니다.

more..



개발 툴 2008.02.20 16:10
사용자 삽입 이미지
리눅스 배포본과 마찬가지로 맥 OS X에는 기본적으로 파이썬이 설치되어 있습니다. 터미널에서 > python[enter]을 입력하면 현재 설치된 파이썬의 버젼을 확인할 수 있습니다. OS X 10.4 (타이거)의 경우에는 2.3대 버젼이 설치되어 있습니다.

현재 파이썬의 경우는 2.5.1 버젼이 나와 있으며 파이썬 사이트에서 다운로드 받을 수 있습니다. GUI 환경에서 클릭만으로 설치할 수 있는 OS X 버젼이 따로 있으니 버젼업을 원하시는 분들은 다운로드 받으셔서 설치하시면 됩니다.

사용자 삽입 이미지
설치는 MacPython.mpkg를 더블클릭하면 간단히 설치됩니다. 설치가 완료되면 응용 프로그램 폴더의 MacPython2.5 폴더에 파이썬의 GUI 툴들이 설치됩니다.

좌측은 파이썬 통합개발환경인 IDLE를 실행한 모습입니다.



기존 버젼은  /System/Library/Frameworks/에 위치하지만 맥파이썬으로 설치하면 /Library/Frameworks/에 설치됩니다. 파이썬 실행 파일들은  /usr/bin/에 위치하며 2.3 버젼의 실행파일에 심볼릭 링크되어 있습니다. 아래와 같이 링크를 변경하면 쉘에서도 2.5 버젼을 사용하실 수 있습니다.

> cd /usr/bin/

> sudo ln -s -f /Library/Frameworks/Python.framework/Versions/2.5/bin/python ./python

> sudo ln -s -f /Library/Frameworks/Python.framework/Versions/2.5/bin/pydoc ./

> sudo ln -s -f /Library/Frameworks/Python.framework/Versions/2.5/bin/pythonw ./

이외에 Objective-C와 혼용 해서 사용할 수있게 해주는 PyObjC가 있습니다. OS X 버젼으로 다운로드 받고 설치하면 Xcode에 PyObjC 프로젝트에 관련된 템플릿을 등록시켜 줍니다. OS X 10.5 (레오퍼드)에는 기본으로 설치되어 있다고 하는데 확인하지는 못했습니다.

저는 파이썬을 능숙하게 사용하지 못합니다. 하지만 간단한 용도로 log등의 대용량 텍스트 파일 처리나 DB에서 데이터를 가져와서 재가공해서 넣는 작업, 복잡한 수치 계산, 쉘스크립트 대용으로 매우 유용하게 사용하고 있습니다.

파이썬은 다른 언어와 비교해 시작하기가 매우 쉽고, 용도에 따라 다양한 모듈을 가지고 있으며 강력합니다. OS X, 리눅스는 물론이고 윈도우즈에서도 편리하게 사용할 수 있습니다. IT관련 업무를 하는 분들이 아니더라도 컴퓨터를 이용해 효율적인 작업을 하고 싶은 분들은 잠깐 시간을 투자하여 배워 보시는 것도 괜찮을 것 같습니다.

'개발 툴' 카테고리의 다른 글

프로젝트 관리 도구 OpenProj  (2) 2008.03.21
적당히 참견하는 Xcode  (4) 2008.02.25
OS X의 파이썬  (0) 2008.02.20
Java 교육용 프로그램 Greenfoot  (0) 2007.12.23
Xcode에서 Flex - Hello World 작성  (0) 2007.12.12
Adobe Flex Builder를 딱 한번 써보고...  (8) 2007.12.03