1) 파이썬3 언어 레퍼런스 https://docs.python.org/ko/3/reference/
- python을 사용할때 필요한 파이썬에서 제공하는 래퍼런스입니다. 사용할떄 항상 참고해서 볼 수 있는 사이트입니다.
보통 3.12.4 정도 혹은 그 이상으로 보면 보통 많다고 합니다.
2) 파이썬3 표준 라이브러리 https://docs.python.org/ko/3/library/
- 파이썬의 라이브러리들이 제공되어있습니다. 클래스, 메소드 상수 등등 있습니다
이 많은 모든것을 외울 수 없기때문에 북마크 사용해서 사용하면 됩니다.
Contents
# 문자 데이터
# 숫자 데이터
# 날짜 데이터
# 객체 데이터
# 포맷 데이터
# 원격 JSON 데이터
문자 데이터 :
문자데이터를 처리하는 다양한 라이브러리
# 문자데이터는 데이터 처리시 가장 많은 빈도로 사용되므로 매우 다양한 라이브러리가 존재함
# textwrap : 문자열 가공에 사용됨
# re : 정규표현식을 이용한 문자열 처리
-기호들 몇개를 익혀우면 코드가 정말 짧아져서 좋으니 꼭 알아두면 좋습니다.
## 문자열 처리 라이브러리
# 내장라이브러리는 파이썬에서 기본 제공하는 라이브러리라서 별도 설치가 불필요합니다
# 외부라이브러리는 파이썬 설치 후에 별도로 설치해야 가능
# 내장라이브러리 사용시는 import 구문 사용
#출력함수
def p(str):
print(str, "\n")
# textwrap
import textwrap
str = "Hello Python"
#문자열 길이 축약
p(textwrap.shorten(str, width=10, placeholder="..."))
#문자열 반복
str = str * 10
p(str)
# 문자열 공백 기준으로 11개의 요소화 해서 리스트로 변환
wrapstr = textwrap.wrap(str, width=11)
p(wrapstr)
#리스트의 각 요소에 줄바꿈문자를 붙여서 문자열로 전달
p("\n".join(wrapstr))
re
##re (regular expression, 정규 표현식)
# 문자열 전체에서 부분 문자열들을 탐색, 추출, 대체하는데 사용되는
# 패턴문자열과 플래그문자열의 조합인 식
# 모든 프로그래밍 언어에서 공통적으로 사용되는 식이므로 학습 필수!
import re
str = "홍길동의 전화번호는 010-1234-5678"
pattern = re.compile("(\d{3})-(\d{4})-(\d{4})")
p(pattern.sub("\g<1> \g<2> \g<3>", str))
즉 str에있는 형식이
pattern,sub의 형식으로 변경됩니다.
출력은 - 가 빠진
홍길동의 전화번호는 010 1234 5678
이라고 출력됩니다.
/d | 숫자 |
/d{3} | 숫자가 3개 나온다 |
래퍼런스를 참고한 다양한 코드입니다.
이런식으로 파이썬 래퍼런스를 활용해서 많은것들을 사용할 수 있습니다.
기호 | 뜻 |
[^a] | a가 아니다 |
^a | a로 시작한다 |
+ | 1개 이상 |
* | 0개 이상 |
$ | 시작하는 것 |
? | 0이나 1 |
a{m} | a가 m번 반복된다 |
{m,n} | m번이상n이하 |
\? | ?라는 문자를 표시(? 말고 다른거 넣으면 다른 문자가 나옴) |
[] | 집합표시 |
| | or기호 [a|b] a가 나오거나 b가 나오거나라는 뜻 |
/b | 공백문자열이랑 매칭되는 기호입니다 |
/B | 공백이 아닌 것을 의미 |
/d | 숫자인것 |
/D | 숫자가 아닌것 |
/s | 문자열 |
/S | 문자여려 아닌거 |
/w | 워드단위 |
/W | 워드단위가 아닌것 |
플래그(Flags) | |
g | 전체영역 |
m | 멀티라인 플래그 입니다. 문자열이 여러줄로 구성되어 있을때 여러줄에서 검색하는 것이죠 m플래그가 없으면 멀티라인문자열의 경우 첫번째 라인에서만 문자를 찾게 되요 |
i | 대소문자 기본없이 |
만들어보이면좋은것
1. 전화번호
2. 이메일
3. IP주소
4. 주민등록번호 등
사용되는 패턴을 만들어봅시다!
#정규 표현식 예제
text = "I like apple pie"
result = re.findall(r"apple",text)
p(result)
# 2. 1개 이상의 숫자를 검색
text= " My phone number is 010-1234-6789"
result = re.findall(r"\d+", text)
p(result)
##결과
['apple']
['010', '1234', '6789']
\d+ 의 의미가
숫자가 1개이상 나오느것을 의미하니까 리스트의 형태로 나옵니다.
이렇게 r(정규표현식)을 알면 굉장히 편하게 됩니다.
# 3. 간단한 이메일주소 패턴 검색
text = "email address is example@email.com"
result = re.findall(r"\b\w+@\w+\.\w+\b", text)
p(result)
#결과
['example@email.com']
전체문자열에서 이메일 주소만 뽑고싶을때 사용합니다.
\b = 공백문자
\w = 워드(영문자 혹은 숫자)
여기에 +가 붙었으니가 워드가 1개 이상이라는 의미죠
@ : 기호
\w+ = 워드
\. = '.'이라는 문자열 자체입니다.
# 4. 간단한 휴대폰번호 패턴 검색
text = "Call me at 010-1234-5678"
result = re.findall(r"\d{3}-\d{4}-\d{4}", text)
p(result)
##결과
['010-1234-5678']
# 5. 영문대문자 패턴 검색
text = "Hello Python"
result = re.findall(r"[a-z]", text)
print(result)
소문자만 뽑으라는거니까
['e', 'l', 'l', 'o', 'y', 't', 'h', 'o', 'n']
이나오게 됩니다
A-Z, 0-1 등 다양하게 사용할 수 있습니다.
#6. 문자열 내의 불필요한 공백 제거
text= "Hello Python This is me"
result = re.sub(r"\s+", " ", text)
p(result)
#결과
Hello Python This is me
위와 다르게 findall이 아닌 sub으로 사용했습니다.
# 7. 문자열의 시작과 끝 검색
# ^: 시작, [^]:부정 ex)^a: a문자로 시작, [^a]: a문자가 아님
text = "Hello World"
result = re.findall(r"^Hello|World$", text)
p(result)
#결과
['Hello', 'World']
^는 시작하는단어~
$는 끝나는 의미니까 결과가 Hello World가 나오게 됩니다.
스펠링주의해야합니다.
# 8. 특정 단어로 시작하는 문자열 검색
text = "Start your journey with a smile. Start early to avoid traffic."
result = re.findall(r"\bStart\b[^.]*\.", text)
p(result)
#결과
['Start your journey with a smile.', 'Start early to avoid traffic.']
# 9. 문자열에서 URL 검색
text= "Website URL is http://example.com or https://www.example.com"
result = re.findall(r"https?://[^\s]+", text)
p(result)
#결과
['http://example.com', 'https://www.example.com']
#10. 날짜형식(년도 4자리-월 2자리- 일 2자리)검색
text= " 오늘은 2024-07-27일 이고 내일은 2024-07-28일"
result = re.findall(r"\d{4}-\d{2}-\d{2}", text)
p(result)
#결과
['2024-07-27', '2024-07-28']
숫자 데이터
숫자데이터를 처리하는 다양한 라이브러리
# 숫자데이터 처리에 사용되는 라이브러리
# math : 수학 관련
# decimal : 소수점 처리
# fractions : 분수 처리
# random : 랜덤한 수 추출
# statistics : 평균값, 중간값 처리
### numberdata.py
## 숫자 처리 라이브러리
#math
import math
def p(str):
print(str, "\n")
import math
p(math.gcd(60, 80, 100)) #최대 공약수
p(math.lcm(15,25)) #최소공배수
# decimal
from decimal import Decimal
p(0.1 * 3) #메모리의 한계로 인해서 소수점 연산 부정확함
p(Decimal('0.1') * 3) #정확한 소수연산시에 Decimal 사용
# fractions
from fractions import Fraction
p(Fraction(1.5)) #분수
# random
import random
p(random.randint(1,45)) #1~45까지의 랜덤 정수
lottoNum = set()
while True:
lottoNum.add(random.randint(1,45))
if (len(lottoNum)==6):
break
p(list(lottoNum))
#statistics
import statistics
score = [38, 54, 45, 87, 92]
p(statistics.mean(score)) # 평균값
p(statistics.median(score)) #중간값 (=중앙값)
날짜 데이터
날짜데이터를 처리하는 다양한 라이브러리
#datetime
#calendar
### 날짜 데이터
def p(str):
print(str, '\n')
# datetime
import datetime
today = datetime.date.today()
p(today)
p(today.weekday()) #요일
p(today + datetime.timedelta(days=100)) # 100일 후
p(today + datetime.timedelta(days=-669)) # 670일 전
p(today + datetime.timedelta(weeks=3)) #3주 후
p(today + datetime.timedelta(hours=45)) #45시간 후
day1 = datetime.date(2019, 1, 1)
day2 = datetime.date(2024, 7, 27)
p(day2 - day1) #날짜 간격
#calendar
import calendar
p(calendar.weekday(2024,7,27)) #요일
p(calendar.isleap(2024)) #윤년 여부
객체 데이터
객체 데이터를 처리하는 다양한 라이브러리
#pickle
#shelve
### objectdata.py
## pickle
import pickle
obj = {
"name": "홍길동",
"age": 20,
}
# obj,obj파일에 obj객체의 데이터를 바이너리로 쓰기
#wb : 바이너리 쓰기모드
with open('obj.obj', 'wb') as f:
pickle.dump(obj, f)
# obj,obj파일에서 바이너리 데이터를 읽기
#rb : 바이너리 읽기모드
with open('obj.obj', 'rb') as f:
print(pickle.load(f))
## shelve
import shelve
def save(key, value):
with shelve.open("shelve") as f:
f[key] = value
def get(key):
with shelve.open("shelve") as f:
return f[key]
save("number", [1, 2, 3, 4, 5])
save("string", ["a", "b", "c"])
print(get("number"))
print(get("string"))
포맷 데이터
포맷팅된 데이터를 처리하는 다양한 라이브러리
#csv
#xml
- xml 선언문
<?xml version= "1.0" encoding="utf-8"?>
-xml 구조
<books>
<book>
<isbn>eee-00--ee-fe</isbn>
<title>파이썬기초</title>
</book>
</books>
-xml은 데이터 덩치가 크고 속도가 느리다
-xml은 데이터 구조확인하기 편하다.
#json
-장점
전송속도가 빠르고, 데이터 송신비용이 줄어든다
-단점
데이터 구조를 알기 어려움
### formatdata.py
## 포멧데이터 : 네트워크상에서 주고 받는 데이터의 형식
# 데이터 : 문자(csv, XML, JSON ...), 바이너리(jpg, mp4...)
# 네트워크상의 데이터
# 1. CSV (Comma Separated Value, 콤마로 구분된 값)
# 2. XML (Extensible Markup Language, 확장 가능한 표기 언어)
# 장점 : 데이터구조+데이터, 단점: 데이터표현에 많은 바이트를 사용 => 네트워크 비용이 큽니다.
# 3. JSON (JavaScript Object Notation, 자바스크립트 객체표기법)
# 장점: 데이터만 가지고있기때문에 네트워크비용 절감이 가능합니다.
# 단점: 데이터 구조표현이 불가함, 그래서 미리 서로 약속을 하고 데이터를 사용합니다.
# 4. XML + JSON
# CSV
import csv
with open('csvdata.csv', mode='w', encoding='utf-8') as f:
# delimiter : 데이터 구분자
# quotechar : 문자열로 인식하는 문자
writer = csv.writer(f, delimiter=',', quotechar="'")
#csv파일에 행 쓰기
writer.writerow(['홍길동', '30', '서울'])
writer.writerow(['강감찬', '40', '부산'])
with open('csvdata.csv', mode='r', encoding='utf-8') as f:
print(f.read())
import xml.etree.ElementTree as ET
# 최상위 요소 생성
persons = ET.Element("persons")
# 첫 번째 person 요소 생성
person1 = ET.SubElement(persons, "person")
name1 = ET.SubElement(person1, 'name')
name1.text = '홍길동'
age1 = ET.SubElement(person1, 'age')
age1.text = "20"
# 두 번째 person 요소 생성
person2 = ET.SubElement(persons, "person")
name2 = ET.SubElement(person2, 'name')
name2.text = '강감찬'
age2 = ET.SubElement(person2, 'age')
age2.text = "30"
# XML 문자열로 변환
xmlstr = ET.tostring(persons, encoding="utf-8").decode()
print(xmlstr)
# XML 파일에 저장
with open("wmldata.xml", mode="w", encoding="utf-8") as f:
f.write(xmlstr)
# XML 파일 읽기 및 출력
with open("wmldata.xml", mode="r", encoding="utf-8") as f:
print(f.read())
# 원격 JSON 데이터
- 제이슨 소개이트(홈페이지)
- 간단한 데이터 포멧이기에 1페이지밖에없습니다.
- ECMA 404 스펙입니다.
https://www.json.org/json-en.html
오토마타 그래프로 그려져있습니다.
ECMA-404 를 읽어보면 신택스를 알게됩니다.
데이터를 교환을 위한 문자열(형식)이라고 합니다.
https://www.w3.org/ <--------사이트는 WEB 개발하는사람들은 다 아는 사이트입니다.
웹의 표준을 정하는 곳입니다.
단 자바스크립트는 ECMA입니다.
http://jsonplaceholder.typicode.com
- 무료 오픈서버라고 생각하면 됩니다.
- json데이터를 받아올 수 있는 사이트입니다.
- 위 주소 뒤에 /posts 를 치게되면
이런식으로 json데이터를 볼아올 수 있습니다.
서버 하나 임대해서 누군가 저런 요청하면 한글화 서비스...(별)하면 되게 돈 많이벌거같다고 합니당 ㅋㅋ
# JSON
import json
jsonDic = {
"name": "홍길동",
"age": 20,
}
with open("jasondata.json", mode='w', encoding='utf-8') as f:
writer = json.dump(jsonDic, f)
# 원격지의 JSON 데이터를 처리하는 다양한 라이브러리 지원
# requests (외부라이브러리)
# urllib # aiohttp (외부라이브러리)
# 외부라이브러리는 별도의 추가 설치가 필요 (파이참사용시)
File > Settings.. > Project:프로젝트명 > Python Interpreter > + > 라이브러리명 검색 > Install Package
### remotejsondata.py
## 원격 서버의 JSON데이터 처리
# requests, josn
import requests
import json
# get요청으로 JSON데이터 불러오기
response = requests.get('https://jsonplaceholder.typicode.com/posts')
data = response.json()
print(data)
# post요청으로 JSON 데이터 등록
# 딕셔너리로 데이터 생성
sendData = {
"userId": 1,
"id": 101,
"title": "Sample Title",
"body": "sampole body sample body yeah"
}
response = requests.post(
'https://jsonplaceholder.typicode.com/posts',
sendData
)
print(response.text)
json형태로 get을 넣어봤습니다. 물론 페이지에 반영이되지는 않지만
어떻게 하는지 대략적으로 확인할 수 있습니다.
#urllib
#200 == ok, 403 == forbbiden, 404 == not found, 500 ==sever error
from urllib.request import urlopen
# url에 연결
response = urlopen('https://jsonplaceholder.typicode.com/posts')
# 응답이 성공했다면
if response.getcode() == 200: #ok(서버에서 정상적으로 응답했다는 응답코드)
# 응답 데이터를 utf-8 형태로 수신
data = json.loads(response.read().decode('utf-8'))
for post in data:
print(post['title'])
else:
print('에러!')
title하나씩 가져오게됩니다.
여기서 이제 알아야하는것은 코드를 모두 외운다고 하는것보다는 어떤 과정인지를 이해하는것이 중요합니다.
# 동기통신과 비동기 통신
이름 | 정의 | 장점 | 단점 |
동기통신 (Synchronous Commmunication) |
요청,순서를 정해놓은 통신방식 | 응답의 순서를 알 수 있다 (= 다음 요청때 이전 응답의 결과를 사용할 수 있다.) |
비동기 통신에 비해서 느리다. blocking위험이 있다.(응답이 안오는 경우, 다음 응답을 할 수 없다) |
비동기통신 ( Asynchronous Commmunication) |
요청 후 응답을 대기하지 않고 바로 다음 요청을 하는 통신 방식 | 속도가 동기통신에 비해 빠름 | 응답순서를 알 수 없다 (= 다음 요청때 이전 응답의 결과를 확신할 수 없습니다) |
#aiohttp
import aiohttp
#비동기 처리하는것
import asyncio
async def fetch_json(url):
# 연결(Session)을 생성
async with aiohttp.ClientSession() as session:
# 세션을 통해서 URL의 데이터를 가져오기
async with session.get(url) as response:
data = await response.json()
return data
#비동기 함수를 호출하는 비동기 함수
async def main():
# 호출할 URL 저장
url = 'https://jsonplaceholder.typicode.com/posts'
# 비동기로 URL의 데이터를 호출합니다.
# awiat : 비동기 처리중에 동기거리해야하는 코드 앞에 사용하는 키워드
# fetch_json(url)의 결과가 나오면 data에 저장함
# blocking method (처리 완료를 보장하는 메소드)
data= await fetch_json(url)
# 들여쓰기 4칸 하면서 data를 출력
print(json.dumps(data, indent=4))
asyncio.run(main())
# 실습
# aiohttp모듈을 이용해서 http://jsonplaceholder.typicode.com/users
# 데이터를 로딩한 후에 사용자의 이름과 전화번호를 출력하는 프로그램 작성
async def main2():
url = 'http://jsonplaceholder.typicode.com/users'
response = await fetch_json(url)
for dict in response:
print(dict['name'], dict['phone'])
asyncio.run(main2())
JSON | Python | 기호 |
array | list | [] |
object | dictinonary | {} |
'언어 > Python' 카테고리의 다른 글
[Python] Class & Object,Module & Package, Exception Handling (0) | 2024.07.27 |
---|---|
[유튜브 나도코딩 1분파이썬] 100분완성 강의 요약본 #52강~62강(완강) (1) | 2024.05.19 |
[유튜브 나도코딩 1분파이썬] 100분완성 강의 요약본 #47강~51강 (1) | 2024.05.17 |
[유튜브 나도코딩 1분파이썬] 100분완성 강의 요약본 #42강~46강 (1) | 2024.05.11 |
[Python] 문법 ~~~~32~~41 (0) | 2024.05.10 |