# Three way for counting


# 실제 뉴스 기사에 대해 각각 형태소 분석기를 적용하기

# 우선 cmd 창에서 konlpy 설치



sents = ['최순실 씨가 외국인투자촉진법 개정안 통과와 예산안 반영까지 꼼꼼이 챙긴 건데, 이른바 외촉법, 어떤 법이길래 최 씨가 열심히 챙긴 걸까요. 자신의 이해관계와 맞아 떨어지는 부분이 없었는지 취재기자와 한걸음 더 들여다보겠습니다. 이서준 기자, 우선 외국인투자촉진법 개정안, 어떤 내용입니까?',

        '한마디로 대기업이 외국 투자를 받아 계열사를 설립할 때 규제를 완화시켜 주는 법안입니다. 대기업 지주사의 손자 회사가 이른바 증손회사를 만들 때 지분 100%를 출자해야 합니다. 대기업의 문어발식 계열사 확장을 막기 위한 조치인데요. 외촉법 개정안은 손자회사가 외국 투자를 받아서 증손회사를 만들 땐 예외적으로 50% 지분만 투자해도 되게끔 해주는 내용입니다.',

        '그만큼 쉽게 완화해주는 거잖아요. 그때 기억을 더듬어보면 야당의 반발이 매우 심했습니다. 그 이유가 뭐였죠? ',

        '대기업 특혜 법안이라는 취지였는데요. (당연히 그랬겠죠.) 당시 박영선 의원의 국회 발언을 들어보시겠습니다. [박영선 의원/더불어민주당 (2013년 12월 31일) : 경제의 근간을 흔드는 법을 무원칙적으로 이렇게 특정 재벌 회사에게 특혜를 주기 위해 간청하는 민원법을 우리가 새해부터 왜 통과시켜야 합니까.]',

        '최순실 씨 사건을 쫓아가다 보면 본의 아니게 이번 정부의 과거로 올라가면서 복기하는 듯한 느낌이 드는데 이것도 바로 그중 하나입니다. 생생하게 기억합니다. 이 때 장면들은. 특정 재벌 회사를 위한 특혜라고 말하는데, 어떤 기업을 말하는 건가요?',

        'SK와 GS 입니다. 개정안이 통과되는 걸 전제로 두 회사는 외국 투자를 받아 증손회사 설립을 진행중이었기 때문인데요. 당시 개정안이 통과되지 않으면 두 기업이 수조원의 손실이 생길 수 있는 것으로 알려져 있었습니다. 허창수 GS 회장과 김창근 SK회장은 2013년 8월 박 대통령과 청와대에서 대기업 회장단 오찬자리에서 외촉법 통과를 요청한 바도 있습니다. ',

        '물론 두 기업과 최순실 씨와 연결고리가 나온 건 아니지만, 정 전 비서관 녹취파일 속 최 씨는 외촉법에 상당히 집착을 하는 걸로 보이긴 합니다.',

        '네 그렇습니다. 통화 내용을 다시 짚어보면요. 최 씨는 외촉법 관련 예산이 12월 2일, 반드시 되어야 한다, 작년 예산으로 돼서는 안 된다고 얘기하고 있는데요. 다시 말해서 외촉법 관련 예산안이 내년에 반영되어야 한다고 압박을 하고 있는 겁니다. 그러면서 "국민을 볼모로 잡고 있다"며 "국회와 정치권에 책임을 묻겠다"고 으름장까지 놓고 있는데요. 매우 집착하는 모습인데요. 이에 대해서 정 전 비서관이 "예산이 그렇게 빨리 통과된 적 없습니다"고 말하자 말을 끊으면서 매우 흥분한 듯, "그렇더라도, 그렇더라도" 하면서 "야당이 공약 지키라고 하면서 협조는 안 한다", "대통령으로 할 수 있는 일이 없다", "불공정 사태와 난맥상이 나온다"며 굉장한 압박까지 하고 있습니다.',

        '이 얘기들만 들여다봐도 마치 본인이 대통령처럼 얘기하고 있습니다. 내용들 보면 그렇지 않습니까? 혹시 최 씨가 이 외촉법 통과로 이득을 본 경우도 있습니까. ',

        '최 씨가 입김을 넣어 차은택 씨가 주도를 한 걸로 알려진 K컬처밸리 사업이 그렇다는 얘기가 나오고 있습니다. 외촉법을 편법으로 활용해 1% 금리를 적용받았다는 지적이 나오고 있습니다. 본격 사업이 추진되기 전 최순실 국정개입 사건이 터지기는 했지만, 이외에도 다른 혜택을 받았는지는 조사가 필요해 보입니다. ',

        '그런데 녹취파일을 보면 "남자1"이 등장합니다. 이 사람은 누구입니까?',

        '정 전 비서관을 "정 과장님"으로 부르며 반말을 하는 남자인데요. 최순실 씨처럼 정 전 비서관을 하대하고 있습니다. 또 청와대 내부 정보를 알고 있는 듯하고 또 인사에까지 개입하려고 하고 있습니다. 그렇기 때문에 정윤회 씨로 추정은 됩니다만 확인은 되지 않습니다.'

]


from konlpy.tag import Twitter

twitter = Twitter()


tokens = [pos for sent in sents for pos in twitter.pos(sent)]

print(tokens[:50])


# 각 단어들이 몇 번 등장했는지 횟수 카운팅

# 1) dict 이용

counter = {}

for word in tokens:

    if word in counter:

        counter[word] = counter[word] + 1

    else:

        counter[word] = 1

print(list(counter.items())[:5], '...')

        



ModuleNotFoundError: No module named 'jpype'


'파이썬' 카테고리의 다른 글

numpy array, broadcast  (0) 2017.10.03
__init__  (0) 2017.10.03
konlpy 설치  (0) 2017.08.30
beautiful soup 4, lxml, requests 설치 방법  (1) 2017.08.30
Scraping Naver Movie  (0) 2017.08.30

# konlpy 설치 방법

(http://konlpy.org/ko/v0.4.3/install/) 참고



1. Jpype1 다운 받고 설치(http://konlpy.org/ko/v0.4.3/install/)

  이때 파이썬 버전과 비트에 맞게 다운받아야 함

  파이썬 버전이 3.6.1이면 cp36을 32비트면 win32를, 64비트면 amd64 선택


2. cmd 창에서 cd 명령어를 이용하여 python 파일이 있는 폴더로 이동


3. cmd 창에 pip install --upgrade pip 입력


3. cmd 창에 pip install jpype가 저장된 경로\JPype1-0.5.7-cp27-none-win_amd64.whl 입력


4. cmd 창에 pip install konlpy 입력

'파이썬' 카테고리의 다른 글

__init__  (0) 2017.10.03
Three way for counting  (0) 2017.08.30
beautiful soup 4, lxml, requests 설치 방법  (1) 2017.08.30
Scraping Naver Movie  (0) 2017.08.30
_yield_len_iter  (0) 2017.08.29

# beautiful soup 4, lxml, requests 설치 방법


1. cmd 창에서 cd 명령어를 이용하여 python 파일이 있는 폴더로 이동

2. cmd 창에 pip install beautifulsoup4 입력

3. cmd 창에 pip install lxml 입력

4. cmd 창에 pip install requests 입력



<설치 예>


'파이썬' 카테고리의 다른 글

Three way for counting  (0) 2017.08.30
konlpy 설치  (0) 2017.08.30
Scraping Naver Movie  (0) 2017.08.30
_yield_len_iter  (0) 2017.08.29
slice and sorting  (0) 2017.08.29

# scraping naver movie


# scraping: 웹 브라우저로 접근할 수 있는 페이지에 있는 정보 중, 각자가 원하는 정보를 선택하여 로컬 컴퓨터로 가져오는 과정

   특정 웹사이트가 타겟

# crawling: Google, Yahoo, MSN 처럼 모든 정보를 가져옴

# scraping tool

- beautiful soup 4: HTML parser

- lxml: XML parser

- requests: HTTP를 통하여 웹서버와 통신하기 위한 패키지



# 웹페이지 탐색


# 네이버 영화 url

# 라라랜드 'http://movie.naver.com/movie/bi/mi/basic.nhn?code=134963'

# 그래이트 워 'http://movie.naver.com/movie/bi/mi/basic.nhn?code=126034'

# 조작된 도시 'http://movie.naver.com/movie/bi/mi/basic.nhn?code=127382'


from bs4 import BeautifulSoup import os import re import requests import sys from pprint import pprint url_basic_base = 'http://movie.naver.com/movie/bi/mi/basic.nhn?code=%s'


# 라라랜드 id movie_id = 134963


# 웹페이지 가져오기


# requests: 네이버 영화 서버에 어떤 것을 요청할 수 있는 라이브러리 url = url_basic_base % movie_id r = requests.get(url)

# 해당 url의 서버로부터 웹페이지의 정보들을 가져옴

텍스트 외에도 header와 같은 많은 정보들을 포함

html = r.text 

page = BeautifulSoup(html, 'lxml') 

스트링 형식의 html을 lxml이라는 XML parser를 이용하여 문서를 구조화


print(r.headers)

# 해당 통신과 관련된 메타 저보들이 포함된 것 확인 가능

{'Server': 'Apache', 'Pragma': 'no-cache', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache, no-store', 'Content-Language': 'ko-KR', 'P3P': 'CP="ALL CURa ADMa DEVa TAIa OUR BUS IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC OTC", CP="ALL CURa ADMa DEVa TAIa OUR BUS IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC OTC"', 'Vary': 'Accept-Encoding', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html;charset=UTF-8', 'Content-Length': '37691', 'Accept-Ranges': 'bytes', 'Date': 'Wed, 30 Aug 2017 02:50:24 GMT', 'X-Varnish': '3171435474', 'Age': '0', 'Via': '1.1 varnish', 'X-Varnish-Cache': 'MISS', 'connection': 'close'}



# 영화 제목 가져오기



# 제목 드래그한 뒤, 크롬의 Inspect(크롬 한글은 검사)을 누르면 해당 부분의 source code가 우측에 하이라이팅 되어 나타남

# La La Land 영화 제목은 strong이라는 태그 안에 들어있으며,

# 그 태그의 class는 h_movie2


title = page.select('div[class=mv_info] strong[class=h_movie2]')

# mv_info라는 클래스 이름을 갖는 div 아래에 속한, class 이름이 h_movie2인 strong이라는 것을 찾아서 가져온다는 코드

# 결과가 하나가 아닐 수 있으므로 return type은 list


print(type(title))

<class 'list'>


print(len(title), '\n')


print(title, '\n')

[<strong class="h_movie2" title="La La Land , 2016">La La Land




2016</strong>, <strong class="h_movie2" title="La La Land, 2016">La La Land, 2016</strong>] 


print(title[0], '\n')

<strong class="h_movie2" title="La La Land , 2016">La La Land




2016</strong> 


print(title[1], '\n')

<strong class="h_movie2" title="La La Land, 2016">La La Land, 2016</strong>


print(type(title[0]))

<class 'bs4.element.Tag'>


print(title[0].text)

La La Land




2016


print(title[0].text.replace("\t", '').replace('\r','').replace('\n',''))

La La Land, 2016


title = page.select('div[class=mv_info] h3[class=h_movie] a')

print(title[0].text)

라라랜드

      
















'파이썬' 카테고리의 다른 글

konlpy 설치  (0) 2017.08.30
beautiful soup 4, lxml, requests 설치 방법  (1) 2017.08.30
_yield_len_iter  (0) 2017.08.29
slice and sorting  (0) 2017.08.29
list comprehension  (0) 2017.08.28

# _yield_len_iter


# 토크나이징을 하는 작업 등은 text 파일의 line by line으로 처리

# 메모리에 올리지 않아도 됨

# generator 형태로 text를 메모리에 line by line으로 올려서 작업을 하려면 __iter__ 함수를 구현

# DoublespaceLineCorpus는 이미 iter가 구현


class DoublespaceLineCorpus:

    def __init__(self, corpus_fname, iter_sent = False):

        self.corpus_fname = corpus_fname

        self.iter_sent = iter_sent


    def __iter__(self):

        with open(self.corpus_fname, encoding='utf-8') as f:

            for doc_idx, doc in enumerate(f):

                if not self.iter_sent:

                    yield doc

                    continue

                for sent in doc.split('  '):

                    sent = sent.strip()

                    if not sent: continue

                    yield sent

                # doc의 sent에 대하여 empty str이 아니면...

                # 아래의 "for snet in corpus"부분에 sent로 메모리에

                # 그 str 값을 올리라는 의미



corpus = DoublespaceLineCorpus('./day0_3.txt', iter_sent=True)

for n_sent, sent in enumerate(corpus):

    print('{} snet: {}. itslength is {}'.format(n_sent, sent, len(sent)))

# 위의 예시에서 메모리에는 for loop에서 정의되는 sent만 만들어져 사용됨

# 다음 loop로 넘어가면서 메모리에 올라가지 않음

0 snet: 테스트 데이터 입니다. itslength is 11

1 snet: 이것만 한 줄에 두 개의 문장을 넣어둘 겁니다. itslength is 25

2 snet: 문장을 이렇게 만들어 둘거에요. itslength is 16

3 snet: yield test와. itslength is 11

4 snet: len test를 해보세요. itslength is 14


    

# len(corpus)하면 length 출력하게 만들기

class DoublespaceLineCorpus:

    def __init__(self, corpus_fname, iter_sent = False):

        self.corpus_fname = corpus_fname

        self.iter_sent = iter_sent

        self.num_sents = 0

        self.num_docs = 0


    def __iter__(self):

        with open(sef.corpus_fname, encoding='utf-8') as f:

            for doc_idx, doc in enumerate(f):

                if not self.iter_sent:

                    yield doc

                    continue

                for sent in doc.split('  '):

                    sent = sent.strip()

                    if not sent: continue

                    yield sent


    def __len__(self):

        if self.iter_sent:

            if self.num_sents == 0:

                with open(self.corpus_fname, encoding='utf-8') as f:

                    self.num_sents = sum((True for doc in f for sent in doc.strip().split('  ') if sent.strip()))

            return self.num_sents

        else:

            if self.num_docs == 0:

                with open(self.corpus_fname, encoding='utf-8') as f:

                    self.num_docs = sum((True for doc in f if doc.strip()))

            return self.num_docs

        

corpus = DoublespaceLineCorpus('./day0_3.txt', iter_sent=True)

print('when iter_sent == True, n sents = {}'.format(len(corpus)))

when iter_sent == True, n sents = 5


corpus.iter_sent=False

print('when iter_sent == False, n docs = {}'.format(len(corpus)))

when iter_sent == False, n docs = 4



                    



'파이썬' 카테고리의 다른 글

beautiful soup 4, lxml, requests 설치 방법  (1) 2017.08.30
Scraping Naver Movie  (0) 2017.08.30
slice and sorting  (0) 2017.08.29
list comprehension  (0) 2017.08.28
Pickle  (0) 2017.08.28

# Slice and Sorting


# 자연어처리할 때 str slice 많이 함

# list도 slice 가능, 긴 list 출력보다 sublist가 보기 편함



# Slice

s = '0123456789'

print(s)

0123456789


print(s[:3])

012


print(s[0:3])

012


print(s[-5:])

56789


print(s[5:])

56789


print(s[3:7])

3456


# 파이썬에서 str은 character list

l = list(s)

print(l)

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']


print(l[3:7])

['3', '4', '5', '6']



# Sorting

s = '뒤의 다섯글자를 slice 하고 싶다면 아래처럼 하면 됩니다. 이 방법이 좋은 이유는 s의 길이가 얼마이던지 뒤의 5글자를 잘라낸다는 점입니다. 당연히 길이가 10인 s이니, 앞의 5부터 시작해도 동일한 결과가 나옵니다. sorting은 sorted 함수로 손쉽게 할 수 있습니다. 아래의 문장에서 각 글자가 몇 번 등장했는지 카운트를 하여 빈도수 순으로 정렬을 해보겠습니다. 카운트는 collections.Counter를 이용합니다.'

print(s)

뒤의 다섯글자를 slice 하고 싶다면 아래처럼 하면 됩니다. 이 방법이 좋은 이유는 s의 길이가 얼마이던지 뒤의 5글자를 잘라낸다는 점입니다. 당연히 길이가 10인 s이니, 앞의 5부터 시작해도 동일한 결과가 나옵니다. sorting은 sorted 함수로 손쉽게 할 수 있습니다. 아래의 문장에서 각 글자가 몇 번 등장했는지 카운트를 하여 빈도수 순으로 정렬을 해보겠습니다. 카운트는 collections.Counter를 이용합니다.


# counter는 dict 형식, items()를 하면 (글자, 빈도수) pair가 만들어짐

# sorted에서 key는 정렬기준을 정의

from collections import Counter

counter = Counter(s)


print(list(counter.items())[:10], '...\n')

[('뒤', 2), ('의', 5), (' ', 52), ('다', 9), ('섯', 1), ('글', 3), ('자', 3), ('를', 4), ('s', 6), ('l', 3)] ...


# lambda: 이름없는 함수

# lambda x:x[1] : x라는 변수가 들어왔을 때, x[1]을 return하라는 의미

# (단어, 빈도수)가 x로 입력되면 1번째 값인 빈도수를 return

# 이를 기준으로 정렬, 순서는 reverse로 숫자가 큰것에서 작은것으로 decreasing order를 따름

from pprint import pprint

pprint(sorted(counter.items(), key=lambda x:x[1], reverse=True)[:10])

[(' ', 52),

 ('다', 9),

 ('이', 8),

 ('니', 7),

 ('.', 7),

 ('s', 6),

 ('의', 5),

 ('o', 5),

 ('를', 4),

 ('e', 4)]


# reverse 대신 빈도수에 -1을 곱해도 된다
pprint(sorted(counter.items(), key=lambda x:-x[1])[:10])
[(' ', 52),
 ('다', 9),
 ('이', 8),
 ('니', 7),
 ('.', 7),
 ('s', 6),
 ('의', 5),
 ('o', 5),
 ('를', 4),
 ('e', 4)]


# 빈도수 기준으로 정렬

pprint(sorted(counter.items(), key=lambda x:x[1])[:10])

[('섯', 1),

 ('고', 1),

 ('싶', 1),

 ('처', 1),

 ('럼', 1),

 ('됩', 1),

 ('방', 1),

 ('법', 1),

 ('좋', 1),

 ('유', 1)]


# 빈도수, alphabet order로 정렬

pprint(sorted(counter.items(), key=lambda x:(x[1], x[0]))[:10])

[(',', 1),

 ('0', 1),

 ('1', 1),

 ('C', 1),

 ('d', 1),

 ('g', 1),

 ('u', 1),

 ('각', 1),

 ('게', 1),

 ('겠', 1)]


# 함수로 만들어 사용

def sorting_key(x):

    return -x[1]

pprint(sorted(counter.items(), key=sorting_key)[:10])

[(' ', 52),

 ('다', 9),

 ('이', 8),

 ('니', 7),

 ('.', 7),

 ('s', 6),

 ('의', 5),

 ('o', 5),

 ('를', 4),

 ('e', 4)]



'파이썬' 카테고리의 다른 글

Scraping Naver Movie  (0) 2017.08.30
_yield_len_iter  (0) 2017.08.29
list comprehension  (0) 2017.08.28
Pickle  (0) 2017.08.28
Dictionary  (0) 2017.08.28

# list comprehension 

# docs는 list of list of str

# 이를 list of str로 flatten 시킴


docs = [

    '이건 테스트 문장입니다'.split(),

    '두번째 줄입니다'.split(),

    '마지막 줄입니다'.split()

    ]

print(docs)

 [['이건', '테스트', '문장입니다'], ['두번째', '줄입니다'], ['마지막', '줄입니다']]



# flatten 시키기 1

flatten_docs = [word for doc in docs for word in doc]

print(flatten_docs)

['이건', '테스트', '문장입니다', '두번째', '줄입니다', '마지막', '줄입니다']

# for doc in docs 라는 list를 돌면서 그 안의 doc 이라는 list를 가져옴

# 그 다음의 for word in docs는 doc 이라는 list 안의 word 라는 str을 정의

# 이런 word 들을 하나의 list로 묶는다는 의미로 [word for... for...]이 적합



# flatten 시키기 2

flatten_docs_ = []

for doc in docs:

    for word in doc:

        flatten_docs_.append(word)

print(flatten_docs_)

['이건', '테스트', '문장입니다', '두번째', '줄입니다', '마지막', '줄입니다']



# set에도 적용 됨

flatten_docs_set = {word for doc in docs for word in doc}

print(flatten_docs_set)


term_vectors = {

    'doc1' : '이건 테스트 문장입니다'.split(),

    'doc2' : '두번째 줄입니다'.split(),

    'doc3' : '마지막 줄입니다.'.split()

    }

flatten_terms = {term for key, terms in term_vectors.items() for term in terms}

print(flatten_terms)

{'마지막', '줄입니다', '줄입니다.', '테스트', '이건', '두번째', '문장입니다'}


# dict에도 적용 됨

# dict.keys(): dict의 키

# dict.values(): 값

# dict.items(): (key, value) pair

# => iteration 할 수 있는 형태로 제공

d = {

    'a':1,

    'b':2,

    'c':3

    }


print('\nitems()')

for key, value in d.items():

    print(key, value)

items()

a 1

b 2

c 3


print('\nkeys()')

print([key for key in d.keys()])

keys()

['a', 'b', 'c']


print('\nvalues()')

print([value for value in d.values()])

values()

[1, 2, 3]


sum(d.values())



# enumerate

# 1. JAVA처럼 짠 것

I = ['a', 'b', 'c', 'd', 'e']

for i in range(len(I)):

    print('I[{}] = {}'.format(i, I[i]))

I[0] = a

I[1] = b

I[2] = c

I[3] = d

I[4] = e


# 2. enumerate 이용

for i, item in enumerate(I):

    print('I[{}] = {}'.format(i, item))

I[0] = a

I[1] = b

I[2] = c

I[3] = d

I[4] = e


# set, dict와 같이 iterable한 모든 경우에 이용 가능

S = ['a', 'b', 'c', 'd', 'e']

for i, item in enumerate(S):

    print('{}: {}'.format(i, item))

0: a

1: b

2: c

3: d

4: e

    



'파이썬' 카테고리의 다른 글

_yield_len_iter  (0) 2017.08.29
slice and sorting  (0) 2017.08.29
Pickle  (0) 2017.08.28
Dictionary  (0) 2017.08.28
마인크래프트로 배우는 파이썬 프로그래밍  (0) 2017.08.25

# python pickle

# 데이터를 저장하는 방식

# 앞에서는 dict를 JSON으로 저장하였는데, 이는 text 파일 형식으로 dict를 저장한 것

# numpy object, sparse matrix, list, tuple, dict, set 등 모두 pickling 가능


representor = {

    'name': '흑미',

    'age' : 100,

    'interets' : ['programming','game'],

    'friends' : {

        'name' : 'nana',

        'id' : 'na123'

    }

}


from pprint import pprint

pprint(representor)

{'age': 100,

 'friends': {'id': 'na123', 'name': 'nana'},

 'interets': ['programming', 'game'],

 'name': '흑미'}


import os

if not os.path.exists('tmp'):

    os.makedirs('tmp')



# pickle 저장/읽기

# wb: write binary

# rb: read binary

import pickle

with open('tmp/representor.pkl', 'wb') as f:

    pickle.dump(representor, f)


with open('tmp/representor.pkl', 'rb') as f:

    loaded_representor = pickle.load(f)


pprint(load_representor)

{'age': 100,

 'friends': {'id': 'na123', 'name': 'nana'},

 'interets': ['programming', 'game'],

 'name': '흑미'}



'파이썬' 카테고리의 다른 글

_yield_len_iter  (0) 2017.08.29
slice and sorting  (0) 2017.08.29
list comprehension  (0) 2017.08.28
Dictionary  (0) 2017.08.28
마인크래프트로 배우는 파이썬 프로그래밍  (0) 2017.08.25

# python dictionary

# 특징: 1) 항목의 순서를 따지지 않는다

          2) 0 또는 1과 같은 오프셋으로 항목을 선택할 수 없다.

          3) 대신, 값에 상응하는 고유한 키를 지정한다

          4) 키는 대부분 문자열

          5) 딕셔너리는 변경 가능, 키-값 요소를 추가, 삭제, 수정할 수 있음


representor = {

    'name': '흑미',

    'age' : 100,

    'interets' : ['programming','game'],

    'friends' : {

        'name' : 'nana',

        'id' : 'na123'

    }

}


representor['name']

'흑미'


representor['friends']['name']

'nana'


# 예쁘게 출력

from pprint import pprint

pprint(representor)

{'age': 100,

 'friends': {'id': 'na123', 'name': 'nana'},

 'interets': ['programming', 'game'],

 'name': '흑미'}


# representor 저장


fname = 'tmp/representor.json'

folder = fname.split('/')[0]


print(fname, folder)

tmp/representor.json tmp


# 저장하려는 path가 존재하지 않을 때

import os


print(os.path.exists(folder))

True


if not os.path.exists(folder):

    os.makedirs(folder)

    print('created %s' %folder)



# JSON 형식의 데이터 저장

# with open: 해당 구문이 끝나면 f.close() 자동으로 실행


import json

with open('tmp/representor.json', 'w', encoding='utf-8') as f:

          json.dump(representor, f)

    

# JSON 파일 불러오기

with open(fname, encoding='utf-8') as f:

          loaded_representor = json.load(f)

pprint(loaded_representor)

{'age': 100,

 'friends': {'id': 'na123', 'name': 'nana'},

 'interets': ['programming', 'game'],

 'name': '흑미'}



# 새로운 정보 추가하기


representor['likes'] = ['coffee', 'drinks']

pprint(representor)

{'age': 100,

 'friends': {'id': 'na123', 'name': 'nana'},

 'interets': ['programming', 'game'],

 'likes': ['coffee', 'drinks'],

 'name': '흑미'}


# JSONObject에 어떤 key가 들어있는지 확인

print('representor keys:', representor.keys())

representor keys: dict_keys(['name', 'age', 'interets', 'friends', 'likes'])


print('representor ["friends"] keys:' representor['friends'].keys())

representor ["friends"] keys: dict_keys(['name', 'id'])


print('representor has age?:', 'age' in representor)

representor has age?: True


# JSONObject는 dict이기 때문에 존재하지 않는 key 입력시 에러

representor['wrong key']

Traceback (most recent call last):

  File "C:\Users\joo\Desktop\딥러닝\selfStudy\day0\Day0_0.py", line 81, in <module>

    representor['wrong key']

KeyError: 'wrong key'


# 이를 방지하기위해 dic.get('key', default value)를 이용해 default return value를 지정

representor.get('worng key', [])





'파이썬' 카테고리의 다른 글

_yield_len_iter  (0) 2017.08.29
slice and sorting  (0) 2017.08.29
list comprehension  (0) 2017.08.28
Pickle  (0) 2017.08.28
마인크래프트로 배우는 파이썬 프로그래밍  (0) 2017.08.25

+ Recent posts