파일 입출력
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 |