본문 바로가기

Programming/Python

파이썬을 활용한 데이터 길들이기

■ 데이터 컨테이너

- 데이터 컨테이너 또한 데이터 유형 가운데 한 가지

- 파이썬의 데이터 컨데이너 종류는 보통 변수, 리스트, 딕셔너리로 구분

1. 변수

- 문자열, 숫자, 데이터 컨테이너를 저장할 수 있다.

- 변수명은 변수에 담겨 있는 내용을 나타내는 소문자 

  (혹은 밑줄 표시로 연결된 단어들)로 구성된다.

- 변수명 규칙

1) 밑줄('_')은 가능하지만 '-'(hyphen)은 사용하지 않는다.

2) 숫자는 사용할 수 있지만 변수 명이 숫자로 시작하면 안된다.

3) 읽기 쉽도록 소문자를 이용하고 단어들을 밑줄 표시로 구분한다.


2. 리스트

- 형식 : shopping_list = ['milk','lettuce','eggs']

- 리스트에 변수도 저장이 가능하다

>>> cats = 2

>>> dogs = 5

>>> horses = 1

>>> animal_counts = [cats, dogs, horses]

[2, 5, 1]


3. 딕셔너리

- 형식 : 

>>> animal_counts = {'cats': 2, 'dogs': 5, 'horses': 1}

>>> animal_counts['dogs']

5


■ 문자열 메서드

- strip : 문자열 공백 제거 메서드

>>> filename = 'budget.csv    '

>>> filename.strip()

budget.csv


- upper : 대문자 변경 메서드

>>> filename = 'budget.csv'

>>> filename.upper()

'BUDGET.CSV'


■ 리스트 메서드

- append : 리스트에 항목을 추가

>>> dog_names = []

>>> dog_names.append('Joker')

>>> dog_names

['Joker']


- remove : 리스트의 항목을 제거하는 메서드

['Joker', 'Simon', 'Ellie', 'Lishka', 'Turtle']

>>> dog_names.remove('Turtle')


■ 딕셔너리 메서드

>>> animal_counts ={}

>>> animal_counts['horses'] =1

>>> animal_counts

{'horses': 1}

>>> animal_counts['cats'] = 2

>>> animal_counts['dogs'] = 5

>>> animal_counts['snakes'] = 0


- keys : 딕셔너리에 포함된 모든 키를 알아볼 때 사용

>>> animal_counts.keys()

['horses', 'cats', 'dogs', 'snakes']


>>> animal_counts['dogs']

5


■ 유용한 메서드

- help : 쓰여진 객체, 메서드 혹은 모듈과 관련도니 도움말을 반환한다.

>>> animals = 'cat,dog,horse'

>>> help(animals.split)

Help on built-in function split:


split(...)

    S.split([sep [,maxsplit]]) -> list of strings


    Return a list of the words in the string S, using sep as the

    delimiter string.  If maxsplit is given, at most maxsplit

    splits are done. If sep is not specified or is None, any

    whitespace string is a separator and empty strings are removed

    from the result.

- 인자 이름이 대괄호([]) 안에 들어 있다면 이 인자는 반드시 필요한 것이 아닌 선택적임을 나타낸다.

이 메서드는 문자열로 이루어진 리스트를 반환(->)한다.

- dir : 객체가 할 수 있는 모든 것들(메서드 및 속성)에 대한 목록을 반환한다.


3장 기계가 읽을 수 있는 데이터

 

- CSV   : Comma-Separated Values

- JSON : JavaScript Object Notation

- XML  : Extensible Markup Language


WHO 데이터 Set

http://apps.who.int/gho/data/node.main

 

 

■ CSV

- csv 데이터 불러오기

import csv


csvfile = open('data-text.csv', 'rb')

reader = csv.reader(csvfile)


for row in reader :

print row

- open 함수를 사용할 때 파일 명은 첫 인자가 되며 이후 선택적으로 어떤 모드에서 이 파일을 열지 설정하게 된다. 'rb'는 읽기전용 모드와 바이너리 모드에서 파일이 열리도록 하는 인자라는 것을 알 수 있다. 그 외에 많이 쓰이는 모드에는 쓰기('w', 혹은 바이너리 모드에서 쓰기를 사용하려면 'wb')가 있다.


위 코드에서는 이 함수의 출력값을 csvfile이라는 변수에 저장한다. 이때 csvfile은 열린 파일을 값으로 갖고 있는 상태이다.


 다음 줄에서는 csvfile을 csv 모듈의 reader 함수에 전달한다. reader 함수는 csv 모듈이 열린 파일을 csv로 읽도록 한다.

reader = csv.reader(csvfile)

 위의 코드를 통해 csv.reader(csvfile) 함수의 출력값은 reader라는 변수에 저장된다.


■ 다른 장소에 있는 파일 열기

 현재 코드에서는 다음과 같이 파일의 경로를 open 함수에 전달한다.

open('data-text.csv', 'rb')

그러나 만약 코드가 data라는 하위 폴더에 저장되어 있다면 스크립트가 그 위치에서 파일을 찾을 수 있도록 다음과 같이 수정해야 한다.

open('data/data-text.csv', 'rb')


■ JSON 데이터 불러오기

import json                                                        --- ①

json_data = open('data-text.json').read()                --- ②

data = json.loads(json_data)                                 --- ③

for item in data:                                                --- ④

print item

 

① JSON파일을 처리하는 데 사용할 json 파이썬 라이브러리(http://docs.python.org/2/library/json.html)를 불러온다.

 

② 내장 파이썬 함수인 open을 이용하여 파일을 연다. 파일 명은 data-text.json(이것은 open 함수의 첫 번째 인자이다)이다. 이 줄에서는 열린 파일의 메서드 가운데 read를 호출하여 이 메서드는 이후 파일을 읽어 json_data 변수에 저장한다.

 

③ json.loads()를 이용해 JSON데이터를 파이썬에 불러온다. data 변수에 출력물이 담긴다.

 

④ for 루프를 이용해 데이터를 순회하고 이 예제의 출력물이 될 각 항목을 출력한다.

 

CSV open 함수는 파일인 객체를 반환하지만, JSON에서는 파일을 일단 열고 난 후 내용을 일기 때문에 str(문자열)을 반환한다.

 

■ XML 데이터 불러오기

 

from xml.etree import ElementTree as ET

 

tree = ET.parse('data-text.xml')

root = tree.getroot()

 

data = root.find('Data')

 

all_data = []

 

for observation in data:

record = {}

for item in observation:

 

lookup_key = item.attrib.keys()[0]

 

if lookup_key =='Numeric':

rec_key = 'NUMBERIC'

rec_value = item.attrib['Numeric']

else:

rec_key = item.attrib[lookup_key]

rec_value = item.attrib['Code']

 

record[rec_key] = rec_value

 

all_data.append(record)

 

print all_data