본문 바로가기
언어/Python

[Python] Library, 정규표현식,json

by 바다의 공간 2024. 7. 29.

1)  파이썬3 언어 레퍼런스 https://docs.python.org/ko/3/reference/

 

The Python Language Reference

This reference manual describes the syntax and “core semantics” of the language. It is terse, but attempts to be exact and complete. The semantics of non-essential built-in object types and of the ...

docs.python.org

 

- python을 사용할때 필요한 파이썬에서 제공하는 래퍼런스입니다. 사용할떄 항상 참고해서 볼 수 있는 사이트입니다.

보통 3.12.4 정도 혹은 그 이상으로 보면 보통 많다고 합니다.

 

2) 파이썬3 표준 라이브러리 https://docs.python.org/ko/3/library/

- 파이썬의 라이브러리들이 제공되어있습니다. 클래스, 메소드 상수 등등 있습니다

이 많은 모든것을 외울 수 없기때문에 북마크 사용해서 사용하면 됩니다.

 

The Python Standard Library

While The Python Language Reference describes the exact syntax and semantics of the Python language, this library reference manual describes the standard library that is distributed with Python. It...

docs.python.org

 

 


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

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

 

JSON

JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of the JavaScript Programming Language Standard ECMA-262 3rd Edition

www.json.org

오토마타 그래프로 그려져있습니다.

 

 

ECMA-404 를 읽어보면 신택스를 알게됩니다. 

 

ECMA-404 - Ecma International

The JSON data interchange syntax - JSON defines a small set of structuring rules for the portable representation of structured data

ecma-international.org

 

 

 

 

ECMA-404 - Ecma International

The JSON data interchange syntax - JSON defines a small set of structuring rules for the portable representation of structured data

ecma-international.org

 

 

데이터를 교환을 위한 문자열(형식)이라고 합니다.

 

 

https://www.w3.org/ <--------사이트는 WEB 개발하는사람들은 다 아는 사이트입니다.

웹의 표준을 정하는 곳입니다.

단 자바스크립트는 ECMA입니다.

 

 

http://jsonplaceholder.typicode.com

 

JSONPlaceholder - Free Fake REST API

{JSON} Placeholder Free fake and reliable API for testing and prototyping. Powered by JSON Server + LowDB. Serving ~3 billion requests each month.

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 {}