본문 바로가기

Data/Python

Python 강좌(4)

파일 입출력



def fileWrite():

    fp = open("text.txt", "wt")

    fp.write('hello')

    fp.close()

    print('file write')

    

fp = open("text.txt", 'r')

rd = fp.read()

fp.close()

print(rd)




List를 받아 저장하는 방법(List객체를 파일로 덤프뜸)



import pickle   #객체 시리얼 라이즈


def obWrite():

    

#     myList = [10, 20, 30]

    myList = [{'name':'홍길동', 'age':20},

              {'name':'이순신', 'age':30}] 


    fp = open('ob.txt', 'wb')   #코드 변형이 가해지면 안되기 때문에 바이너리로 읽는다.


    pickle.dump(myList, fp)

    fp.close()


def obRead():

    fp = open('ob.txt', 'rb')

    rd = pickle.load(fp)

    fp.close()

    for data in rd:

        print("%(name)s %(age)d"%data)


if __name__ == '__main__':

    #객체를 binary file로 저장하고 고대로 읽어보기

    obWrite()

    obRead() 



홍길동 20

이순신 30




Class를 받아 저장하는 방법


import pickle   #객체 시리얼 라이즈


class Student:

    def __init__(self,name, age):

        self.name = name

        self.age = age

    def show(self):

        print(self.name, self.age)


def obWrite():

    std = Student('홍길동', 30)

    fp = open('ob.txt', 'wb')   #코드 변형이 가해지면 안되기 때문에 바이너리로 읽는다.

    pickle.dump(std, fp)


def obRead():

    fp = open('ob.txt', 'rb')

    rd = pickle.load(fp)

    fp.close()

    rd.show()


if __name__ == '__main__':

    #객체를 binary file로 저장하고 고대로 읽어보기

    obWrite()

    obRead() 



홍길동 30

   


사운드, 이미지, 객체 자체..

텍스트 모드와 바이너리 모드의 차이

10 -> 10

13, 10 --> 13,10



문자열 객체 - 멤버함수 활용


#문자열 프로그래밍


s = 'i like Python like programming'

#편집과 치환 관련 메소드

s1 = '    test    '

s2 = '###test###'

s3 = '010-111-222'

s4 = ['aaa', 'bbb', 'ccc']

s5 = 'korea'

s6 = '123'


print(s6.isdigit())     #숫자로만 구성된 문자열인가?

print(s6.isalpha())     #영문으로 구성된 문자열인가?



# print(s5.center(30))

# print(s5.ljust(30))

# print(s5.rjust(30))


# print('-'.join(s4))


# print(s.split())     #디폴트로 스페이스 기준으로 잘라 리스트로 반환해준다.

# print(s3.split('-')) #분리 하고자하는 문자 기준 할당


# print(s.replace('like', 'love'))    #바뀐 단어가 적용된 문자열 리턴


# print(s1.strip())   #모든 공백 삭제

# print(s1.lstrip())  #왼쪽 공백 삭제

# print(s1.rstrip())  #오른쪽 공백 삭제


# print(s2.strip('#'))    #해당 문자 제거

# print(s2.lstrip('#'))   #방향에 따른 문자 제거

# print(s2.rstrip('#'))


# print(s.startswith('i'))    #i라는 문자로 시작하는가? true or false

# print(s.endswith('programming'))    #해당 단어로 끝나는가? 


# print(s.index('like'))

# print(s.index('like', 5))

# print(s.rindex('like'))

# print(s.index('love'))    #해당 단어에 대한 index 정보가 없으면 오류



# print(s.count('like'))

# print(s.find('like'))   #0 베이스 index 부터

# print(s.find('like', 5))   #start를 5번째 부터 검색

# print(s.rfind('like'))   #reverse find

# print(s.find('love'))   #단어가 없으면 -1 리턴


# print(s.upper())    #대문자

# print(s.lower())    #소문자

# print(s.capitalize())   #첫글자만 대문자

# print(s.swapcase()) #대문자는 소문자로, 소문자는 대문자로

# print(s.title())    #앞단어만 대문자








정규식



#정규식


import re


s1 = 'apple ki#i ban\na orange'

s2 = '서울시 은평구'

s3 = '123-abc def-ghi'

s4 = '<a href="index.html">abcdef</a><font class="a.aa" size="10">'

s5 = 'i like python like program'

s6 = 'aaa-bb#ccc.ddd eee'

s7 = 'aaaa ab.bcd.def.kim@gamil.com xxx aa@bb'

s8 = 'PYTHON i like program'

s9 = '''korea hello

korea love

python love'''


s10 = 'hello python hi'

s11 = '\section python'

s12 = 'hello aapythonbb hi'


try:

    #명확하게 구분하여 단어를 찾겠다?

    match = re.search(r'\bpython\b', s12)

    #좌,우에 뭔가단어가 있는데 중간에 있는 것을 찾겠다.

    match = re.search(r'\Bpython\B', s12)

    print(match.group())

    

#     match = re.search(r'\\section', s11)

#     print(match.group())


#     match = re.search('p[a-z]+', s5)

#     print(match.group())

#     print(match.start())

#     print(match.end())

#     print(match.span)

    

    

    #개행열 까지 모든 포함하여 검색?

#     my = re.findall('^ko\w+ \w+', s9, re.MULTILINE)

#     print(my)

    

#     match = re.search('ban.a', s1. re.DOTALL)

#     print(match.group())

    

    #개행 포함하여 다 찾음

#     match = re.search('ban.a', s1. re.DOTALL)

#     print(match.group())

    

    #---조건은 소문자를 찾지만 , 이그노어 옵션을 통해 대소문자 구별을 하지 않는다.

#     match = re.search('p[a-z]+', s8, re.IGNORECASE)

#     print(match.group())

    

    #찾고자 하는 대상(패턴)이 반드시 맨앞에 와야만 찾을 수 있다. search는 다 찾음

#     match = re.match('p[a-z]+', s8)

#     print(match.group())

    

    #패턴에 대하여 미리 컴파일하여 정규식 객체를 반환

    #찾고자 하는 문자열의 객체가 많을 경우 빠른 성능을 발휘 할 수 있다.

#     myReg = re.compile('ki.i')

#     match = myReg.search(s1)

#     print(match.group())

    

#     print('[ sub 활용 ]: string 교체')

#     mys = re.sub('p\w+', 'love', s5)

#     print(mys)

    

    #id만 추출

#     print('id만 추출:findall')

#     myF = re.findall('([\w.]+)@', s7)   #['ab.bcd.def.kim', 'aa']

#     print(myF)

#     

    #이메일 주소만 추출

#     print('이메일 주소만 추출:findall')

#     myF = re.findall('[\w.]+@[\w.]+', s7)   #['ab.bcd.def.kim@gamil.com', 'aa@bb']

#     print(myF)    

    

#     myList = re.split('[-#. ]', s6) # - or, # . 등에 대하여 잘라라. 리스트로 리턴

#     print(myList)

    

#     myF = re.finditer('p[a-z]+', s5)

#     for n in myF:

#         print(n.group())

    

#     myF = re.findall('p[a-z]+', s5)  #List 객체 리턴

#     print(myF)

    

#     match = re.search('p[a-z]+', s5)

#     print(match.group())

    

    

    #문제 - href의 file name을 추출 하라.

#     match = re.search('href="([\w.]+)"', s4)

#     #해석

#     print(match.group(1))

        

#     match = re.search('(\d\d\d)-(\w\w\w)', s3)  #

#     print(match.groups())   #()로 붙인 그룹을 튜플로 묶어준다.

#     print(match.group(1))

#     print(match.group(2))

    

#반복 테스트

#     match = re.search('ap*le', s1)  #못 찾을 경우 예외발생

#     #해당 페턴에 해당되는 a로 시작하면서 le로 끝나면서 p가 0회 이상 반복하면 찾아라.

#     match = re.search('ap+le', s1)  

#     #해당 페턴에 해당되는 a로 시작하면서 le로 끝나면서 p가 1회 이상 반복하면 찾아라.


#     match = re.search('ap{2}le', s1)  #

#     match = re.search('ap{2,4}le', s1)  #


#매칭문자

#     match = re.search('ki.i', s1)  #ki로 시작하고 i로 끝나는데 사이에 있는 한개의 문자가 개행만 아니면 찾는다.

#     match = re.search('^apple', s1) #시작 되는 문자열 매칭

#     match = re.search('nge$', s1) #끝나는 문자 찾기

#     match = re.search('ban[mno]a', s1) #ban으로 시작하고 a로 끝나는데 중간 하나의 문자가 m,n,o 중에 하나면 찾는다

#     match = re.search('ban[a-z0-9A-Z# ]a', s1) #범위 할당

#     match = re.search('서울[시은가]', s2)

#     match = re.search('서울[가-힝]', s2)


#     match = re.search('ban[mno]+a', s1) #매칭 문자와 반복 문자를 조합해서 사용. m,n,o에 해당 하는 문자가 반복되면 찾는다.

#     match = re.search('ban[a-z]+a', s1)

#     match = re.search('app|ddd', s1)    #둘중에 하나(범위도 할당 가능)


#     match = re.search('or\dnge', s1)    #'or[0-9]nge : 이스케이프 기호 모든 숫자와 매칭됨

#     match = re.search('or[\D]nge', s1)    #숫자만 아니면 됨


#     match = re.search('or\snge', s1)    #화이트 스페이스 문자 매칭

#     match = re.search('or\Snge', s1)    #화이트 스페이스만 아니면 됨

#     match = re.search('\S+ \S+', s1)    #[or[^ \t\n]nge


#     match = re.search('ki\wi', s1)  #숫자 또는 문자와 매칭됨

#     match = re.search('ki\Wi', s1)  #숫자 또는 문자가 아닌것과 매칭

    

    #-----------------------------------------------------------------------------

    

except Exception as err:

    print('not found')

        






xml Parsing




import xml.etree.ElementTree as ET

import urllib.request as REQ


kURL = 'http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=109'

response = REQ.urlopen(kURL)

data = response.read().decode('utf-8')

# print(data)


rss = ET.fromstring(data)

print(rss.findall('.//location'))


for locEm in rss.findall('.//location'):

    print(locEm.findtext('city'))

    print('='*20)

    for dataElm in locEm.findall('./data'):

        print('시간:', dataElm.findtext('tmEf'))

        print('날씨:', dataElm.findtext('wf'))

        print('최고기온:', dataElm.findtext('tmx'))

        print('-'*20)



서울

====================

시간: 2016-07-24 00:00

날씨: 흐리고 비

최고기온: 29

--------------------

시간: 2016-07-24 12:00

날씨: 구름많음

최고기온: 29

--------------------

시간: 2016-07-25 00:00

날씨: 구름많음

최고기온: 29

--------------------

시간: 2016-07-25 12:00

날씨: 구름많음

최고기온: 29

--------------------

...



Third party Library 설치 : BeautifulSoup


Cmd-> pip install beautiful4-4.5..tar.gz





xml 저장


# import xml.etree.ElementTree as ET


datas=[{"sname":'홍길동','age':20},

       {"sname":'임꺽정','age':30},{"sname":'이순신','age':40}]


xmlData=[]

xmlData.append("<rss>")

for dt in datas:

    xmlData.append("\t<student>")

    xmlData.append("\t\t<sname>"+dt['sname']+"</sname>" )

    xmlData.append("\t\t<age>"+str( dt['age'] )+"</age>" )

    xmlData.append("\t</student>")


xmlData.append("</rss>")

xmlStr =  '\n'.join(xmlData)

print(xmlStr) 




과제


* 객체지향기반, 

* 처음실행시 파일이 있으면 읽고 2.출력시 내용이 나와야 한다



제품을 입력받아 결과를 출력하시요


메인 메뉴)

     1.입력

     2.출력

     3.수정

     4.저장

     5.종료

     번호를 입력하세요:


입력)


1. 입력


제품명:

갯수:

생산지:

계속 입력하시겠습니까(y/n)? 


입력이 종료되면 메인메뉴로



2.출력

--------------------------------

    제품명       갯수       생산지

-------------------------------

     ㅁㅁㅁ      20        서울시

     ㅁㅁㅁ   


3.수정

수정할 제품명을 입력하세요:

제품명(컴퓨터):

갯수(10):

생산지(서울시)


4. 저장

1.xml 2.객체(pickle)=>저장형식번호를선택하시요 : 




import sys

from bs4 import BeautifulSoup


def inputProductInfo(pList):

    print('\n1. 입력')

    

    if len(pList) > 0:

        productList = pList

    else:

        productList = list()

    

    while True:

        pName = input('제품명 :')

        pMount = input('갯수 :')

        pLocation = input('생산지:')

        

        productInfo = {'name':pName, 'mount':pMount, 'addr':pLocation}

        productList.append(productInfo)

        

        inputStatus = input('계속 입력하시겠습니까?(y/n)?')

        if inputStatus == 'y' or inputStatus == 'Y':

            print('계속 입력')

        else:

            break

        

    return(productList)


def printProductInfo(pList):

    print('\n2.출력')

    print('-'*60)

    infoTop = "{0:>15} {1:>15} {2:>15}".format('제품명', '갯수', '생산지')

    print(infoTop)

    print('-'*60)

    

    for tempProductInfo in pList:

        name = tempProductInfo['name']

        mount = tempProductInfo['mount']

        addr = tempProductInfo['addr']

        pInfo = "{0:>15} {1:>15} {2:>15}".format(name, mount, addr)

        print(pInfo)


def saveProductInfo(pList):

    try:

        menuNum = int(input('1.xml 2.객체(pickle)=>저장 형식 번호를 선택하시오 :'))    

        if menuNum == 1:

            xmlData=[]

            xmlData.append("<rss>")

            for dt in pList:

                xmlData.append("\t<product>")

                xmlData.append("\t\t<pname>"+dt['name']+"</pname>" )

                xmlData.append("\t\t<pmount>"+str( dt['mount'] )+"</pmount>" )

                xmlData.append("\t\t<plocation>"+str( dt['addr'] )+"</plocation>" )

                xmlData.append("\t</product>")

            

            xmlData.append("</rss>")

            xmlStr =  '\n'.join(xmlData)

            fileWrite(xmlStr)

            print('저장하였습니다.')

        else:

            print('Pickle 기능은 지원되지 않습니다.')

    except Exception as err:

                print("에러:", err)


def fileWrite(xmlData):

    fp = open("productInfo.xml", "w")

    fp.write(xmlData)

    fp.close()

 

def fileRead():

    

    laodPList = list()

    try:

        fp = open('productInfo.xml', 'r')

        rd = fp.read()

        fp.close()

        

        soup = BeautifulSoup(rd, 'html.parser')

        for itemElm in soup.findAll('product'):

            productInfo = {'name':itemElm.pname.string, 'mount':itemElm.pmount.string, 'addr':itemElm.plocation.string}

            laodPList.append(productInfo)

        

        return laodPList

    except Exception as err:

        return False


if __name__ == '__main__':

    productList = list()

    print('메인 메뉴)')

    

    state = fileRead()

    if state != False:

        print('성공적으로 파일을 읽어왔습니다.\n')

        productList = state

    else:

        print('파일이 없습니다.\n')

    

    while True:

        print('1.입력')

        print('2.출력')

        print('3.수정')

        print('4.저장')

        print('5.종료')

        

        try:

            menuNum = int(input())

        

            if menuNum == 1:

                productList = inputProductInfo(productList)

            elif menuNum == 2:

                printProductInfo(productList)

            elif menuNum == 3:

                print('수정 기능은 미구현 사항 입니다.')

            elif menuNum == 4:

                saveProductInfo(productList)

            else:

                print('프로그램을 종료 합니다...')

                sys.exit()

                

        except Exception as err:

                print("에러:", err)






반응형

'Data > Python' 카테고리의 다른 글

파이썬 선(禪)(Zen of Python)  (0) 2016.09.22
Python 강좌(5)  (0) 2016.07.22
Python 강좌(3)  (0) 2016.07.20
Python 강좌(2)  (0) 2016.07.19
Python 강좌(1)  (0) 2016.07.18