코드 컨벤션
코드 컨벤션이란, 코드 작성 시 일관성 및 가독성을 높이기 위해 권장되는 가이드라인 (PEP8 문서에 상세히 설명되어 있다)
(1) 들여쓰기(indentation)
- 4개의 공백(space) 권장
- 들여쓰기 일관성
(2) 줄 길이(line length)
- 한 줄 최대 79자 이내
(3) 네이밍 컨벤션
- 함수, 변수, 메소드 : 소문자와 언더스코어(_) 조합, Snake 표기법
- 클래스 : Pascal 표기법 -> 각 단어를 대문자로 구분 ex) PythonIsVeryGood
- 모듈, 패키지 : 소문자, 언더스코어(_)
(4) 공백의 사용(whitespace)
- 연산자 주변의 공백
- 쉼표 뒤의 공백
- 함수나 클래스의 첫 번째 인수 앞에 공백을 넣지 않는다. (def func(a, b))
(5) import문
- 모듈 전체를 가져오기 보다는 필요한 클래스나 함수만 import
- import는 항상 맨 위에 작성
(6) 추가 참고 사항
- 'PIE = 3.14'와 같이 상수 표현 시 모든 문자를 대문자로 표기
- numbers = [1,2,3] 처럼 list를 표현 시 '복수'표현 또는 number_list와 같이 표기 (for number in numbers)
- 함수 네이밍 시 함수가 어떤 역할을 하는 지 잘 표현할 수 있어야 한다.
자주 사용되는 모듈 및 패턴
pprint()
- pretty print 약자. 더 예쁘게 출력
type()
- 값의 자료형 확인
split()
- string을 list로 변환
join()
- list를 string으로 변환
replace()
- 문자열 바꾸기
random()
-랜덤 로직 필요 시
time(), datetime()
- 시간 및 날짜 다루기
정규표현식(regex; regular expression)
문자열이 특정 패턴과 일치하는지 판단하는 형식 언어, 're'모듈 import 필요
- https://regexr.com/ 와 같은사이트를 참고하면 손쉽게 만들 수 있다.
#정규표현식 예시
#이메일 주소 패턴
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
#전화번호 패턴
(\d{3})-(\d{3})-(\d{4})
#URL 패턴
https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+
glob을 활용한 파일과 디렉토리 다루기
파이썬의 'glob'모듈은 파일 경로를 사용하여 디렉토리 내 파일목록을 검색할 때 사용
import glob
files = glob.glob("*.txt")
print(files)
위와 같이 현재 작업 디렉토리에서 .txt 확장자를 가진 모든 파일의 리스트를 가져올 수 있다.
from pprint import pprint
import glob
# ./는 현재 python 파일이 위치한 경로를 의미합니다.
# *은 "모든 문자가 일치한다" 라는 의미를 가지고 있습니다.
# ./venv/*은 venv 폴더 내 모든 파일들을 의미합니다.
path = glob.glob("./venv/*")
pprint(path)
# result output
"""
['./venv\\Include', './venv\\Lib', './venv\\pyvenv.cfg', './venv\\Scripts']
"""
# **은 해당 경로 하위 모든 파일을 의미하며, recursive 플래그와 같이 사용합니다.
# recursive를 True로 설정하면 디렉토리 내부의 파일들을 재귀적으로 탐색합니다.
path = glob.glob("./venv/**", recursive=True)
pprint(path)
# result output
"""
['./venv\\',
'./venv\\Include',
'./venv\\Lib',
'./venv\\Lib\\site-packages',
'./venv\\Lib\\site-packages\\autopep8-2.0.1.dist-info',
...
]
"""
# *.py와 같이 작성 시 특정 확장자를 가진 파일들만 볼 수 있습니다.
# ./venv/**/*.py는 venv 하위 모든 폴더들을 재귀적으로 탐색하며 .py 확장자 파일을 탐색합니다.
path = glob.glob("./venv/**/*.py", recursive=True)
pprint(path)
# result output
"""
['./venv\\Lib\\site-packages\\autopep8.py',
'./venv\\Lib\\site-packages\\pycodestyle.py',
'./venv\\Lib\\site-packages\\pip\\__init__.py',
'./venv\\Lib\\site-packages\\pip\\__main__.py',
'./venv\\Lib\\site-packages\\pip\\__pip-runner__.py',
...
]
"""
itertools
파이썬에서 iterable 객체를 다루는 데 유용한 함수들을 제공하는 표준 라이브러리 모듈. 'itertools' 모듈을 import하여 사용
- count(start=0, step=1) : start부터 시작, step씩 증가하는 무한 반복자
- cycle(iterable) : iterable에서 요소들을 반복하는 무한 반복자 생성
- repeat(object[, times]) : object를 time만큼 반복하는 반복자, (times를 지정하지 않으면 무한 반복)
- chain(*iterables) : 여러 iterable 객체를 하나의 iterable 객체로 이어붙임
- islice(iterable, start, stop[, step]) : iterable 객체에서 start부터 stop-1까지 step만큼 건너뛰며 요소들을 반환
- groupby(iterable[, key]) : iterable에서 연속된 값을 가지는 요소들을 그룹화 함
import itertools
# count 예시
for i in itertools.count(10, 2):
if i > 20:
break
print(i, end=' ') # 10 12 14 16 18 20
# cycle 예시
count = 0
for i in itertools.cycle('ABC'):
if count > 6:
break
print(i, end=' ') # A B C A B C A
count += 1
# repeat 예시
for i in itertools.repeat('Hello', 3):
print(i) # Hello Hello Hello
# chain 예시
for i in itertools.chain('AB', 'CD', 'EF'):
print(i, end=' ') # A B C D E F
# islice 예시
for i in itertools.islice(range(10), 2, 8, 2):
print(i, end=' ') # 2 4 6
# groupby 예시
data = [('A', 1), ('A', 2), ('B', 3), ('B', 4), ('C', 5)]
for key, group in itertools.groupby(data, lambda x: x[0]):
values = [v[1] for v in group]
print(key, values) # A [1, 2] B [3, 4] C [5]
1. 데카르트 곱 구하기
from itertools import product
sample1 = ["A", "B", "C", "D", "E"]
sample2 = [1, 2, 3, 4]
# 행 / 열을 구분하여 프린트 하기 위해 enumerate 사용
for i, v in enumerate(product(sample1, sample2), 1):
print(v, end=" ")
if i % len(sample2) == 0:
print("")
# result output
"""
('A', 1) ('A', 2) ('A', 3) ('A', 4)
('B', 1) ('B', 2) ('B', 3) ('B', 4)
('C', 1) ('C', 2) ('C', 3) ('C', 4)
('D', 1) ('D', 2) ('D', 3) ('D', 4)
('E', 1) ('E', 2) ('E', 3) ('E', 4)
"""
2. 원소 개수가 n개인 순열
from itertools import permutations
sample = ["A", "B", "C"]
# 원소의 개수가 3개인 순열 출력
for i in permutations(sample, 3):
print(i)
# result output
"""
('A', 'B', 'C')
('A', 'C', 'B')
('B', 'A', 'C')
('B', 'C', 'A')
('C', 'A', 'B')
('C', 'B', 'A')
"""
3 원소 개수가 n개인 조합
from itertools import combinations
sample = ["A", "B", "C"]
# 원소의 개수가 2개인 조합 출력
for i in combinations(sample, 2):
print(i)
# result output
"""
('A', 'B')
('A', 'C')
('B', 'C')
"""
4.원소 개수가 n개인 조합(중복 허용)
from itertools import combinations_with_replacement
sample = ["A", "B", "C"]
# 중복을 포함한 원소의 개수가 3개인 조합 출력
for i in combinations_with_replacement(sample, 3):
print(i)
# result output
"""
('A', 'A', 'A')
('A', 'A', 'B')
('A', 'A', 'C')
('A', 'B', 'B')
('A', 'B', 'C')
('A', 'C', 'C')
('B', 'B', 'B')
('B', 'B', 'C')
('B', 'C', 'C')
('C', 'C', 'C')
"""
request
'requests' 모듈은 HTTP 요청을 보내고, 응답을 받는 데 사용되는 파이썬 라이브러리 모듈.
beautifulsoup과 함께 웹 크롤링을 하거나 api 통신이 필요할 때 사용
(사용자가 https://www.naver.com 이라는 페이지에 접속했을 때 나오는 페이지를 python에서 requests 모듈을 사용하면 해당 데이터를 웹브라우저 없이 코드로 받아올 수 있다는 것을 의미)
'requests'모듈을 import하여 GET, POST, PUT, DELETE 등 다양한 HTTP요청을 보내고, 응답을 처리할 수 있다.
*서버 상태 코드 참조 -> https://developer.mozilla.org/ko/docs/Web/HTTP/Status
import requests
# GET 요청 보내기
response = requests.get('https://api.github.com/users/username')
print(response.status_code) # 200
print(response.json()) # JSON 형식의 응답 데이터를 파이썬 객체로 변환
# POST 요청 보내기
data = {'name': 'Alice', 'age': 25, 'city': 'Seoul'}
response = requests.post('https://httpbin.org/post', json=data)
print(response.status_code) # 200
print(response.json()) # JSON 형식의 응답 데이터를 파이썬 객체로 변환
<get 요청 테스트 코드>
import requests
from pprint import pprint
# 통신 할 base url 지정
url = "https://jsonplaceholder.typicode.com/"
# 1번 사용자 정보를 받아오기 위해 users/1 경로에 get 요청
r = requests.get(f"{url}users/1")
pprint({
"contents": r.text,
"status_code": r.status_code,
})
# result output
"""
{'contents': '{\n'
' "id": 1,\n'
' "name": "Leanne Graham",\n'
' "username": "Bret",\n'
' "email": "Sincere@april.biz",\n'
' "address": {\n'
' "street": "Kulas Light",\n'
' "suite": "Apt. 556",\n'
' "city": "Gwenborough",\n'
' "zipcode": "92998-3874",\n'
' "geo": {\n'
' "lat": "-37.3159",\n'
' "lng": "81.1496"\n'
' }\n'
' },\n'
' "phone": "1-770-736-8031 x56442",\n'
' "website": "hildegard.org",\n'
' "company": {\n'
' "name": "Romaguera-Crona",\n'
' "catchPhrase": "Multi-layered client-server neural-net",\n'
' "bs": "harness real-time e-markets"\n'
' }\n'
'}',
'status_code': 200}
"""
<post 요청 테스트 코드>
import requests
from pprint import pprint
# 통신 할 base url 지정
url = "https://jsonplaceholder.typicode.com/"
# 데이터 생성에 사용될 값 지정
data = {
"name": "sparta",
"email": "sparta@test.com",
"phone": "010-0000-0000",
}
# 사용자를 생성하기 위해 users 경로에 data를 담아 post 요청
r = requests.post(f"{url}users", data=data)
pprint({
"contents": r.text,
"status_code": r.status_code,
})
# result output
"""
{'contents': '{\n'
' "name": "sparta",\n'
' "email": "sparta@test.com",\n'
' "phone": "010-0000-0000",\n'
' "id": 11\n'
'}',
'status_code': 201}
"""
json
'json'모듈은 파이썬에서 JSON(JavaScript Object Notation) 형식의 데이터를 다루기 위한 표준 라이브러리 모듈
'json'모듈을 import하여 JSON형식의 데이터를 파이썬 객체로 변환하거나, 파이썬 객체를 JSON형식의 문자열로 변환
- key : value 쌍으로 이뤄져있으며, 파이썬의 딕셔너리 형태와 매우 유사하다.
# json 모듈을 사용하기 위해 import 합니다.
import json
import requests
# 해당 사이트는 요청에 대한 응답을 json 형태의 문자열로 내려줍니다.
url = "https://jsonplaceholder.typicode.com/"
r = requests.get(f"{url}users/1")
print(type(r.text)) # <class 'str'>
# 문자열 형태의 json을 dictionary 자료형으로 변경합니다.
response_content = json.loads(r.text)
print(type(response_content)) # <class 'dict'>
# dictionary 자료형이기 때문에 key를 사용해 value를 확인할 수 있습니다.
print(f"사용자 이름은 {response_content['name']} 입니다.")
# result output
"""
사용자 이름은 Leanne Graham 입니다.
"""
import json
# JSON 형식의 문자열을 파이썬 객체로 변환
json_str = '{"name": "Alice", "age": 25, "city": "Seoul"}'
data = json.loads(json_str)
print(data) # {'name': 'Alice', 'age': 25, 'city': 'Seoul'}
# 파이썬 객체를 JSON 형식의 문자열로 변환
data = {'name': 'Bob', 'age': 30, 'city': 'Busan'}
json_str = json.dumps(data)
print(json_str) # {"name": "Bob", "age": 30, "city": "Busan"}
CSV(Comma-Separated Values)
쉼표(,)를 구분자로 사용하여 데이터를 텍스트 파일에 저장하는 파일 형식
각 열은 쉼표로 구분, 각 행은 새로운 줄로 구분한다.
CSV파일은 데이터베이스나 스프레드시트와 같은 데이터 저장소에서 데이터를 내보낼 때, 프로그렘에서 데이터를 처리할 때 사용
'csv'모듈은 CSV파일을 읽고 쓰는데 사용
import csv
with open('example.csv', newline='') as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in reader:
print(row)
위 코드는 'example.csv' 파일에서 각 행을 읽고 각 행을 리스트로 출력한다.
'delimiter' 매개변수는 쉼표로 구분되어 있으며, 'quotechar' 매개변수는 인용 부호로 묶여있다.
*csv파일 다루기 예시
- csv 파일 읽기
# 파이썬에서 csv 파일을 다루기 위해 모듈 import
import csv
csv_path = "sample.csv"
# csv를 list 자료형으로 읽기
csv_file = open(csv_path, "r", encoding="utf-8")
csv_data = csv.reader(csv_file)
for i in csv_data:
print(i)
# 작업이 끝난 csv 파일을 닫아줍니다.
csv_file.close()
# result output
"""
['email', 'birthyear', 'name', 'Location']
['laura@example.com', '1996', 'Laura Grey', 'Manchester']
['craig@example.com', '1989', 'Craig Johnson', 'London']
['mary@example.com', '1997', 'Mary Jenkins', 'London']
['jamie@example.com', '1987', 'Jamie Smith', 'Manchester']
['john@example.com', '1998', 'John', 'Manchester']
"""
# csv를 dict 자료형으로 읽기
csv_file = open(csv_path, "r", encoding="utf-8")
csv_data = csv.DictReader(csv_file)
for i in csv_data:
print(i)
csv_file.close()
# result output
"""
{'email': 'laura@example.com', 'birthyear': '1996', 'name': 'Laura Grey', 'Location': 'Manchester'}
{'email': 'craig@example.com', 'birthyear': '1989', 'name': 'Craig Johnson', 'Location': 'London'}
{'email': 'mary@example.com', 'birthyear': '1997', 'name': 'Mary Jenkins', 'Location': 'London'}
{'email': 'jamie@example.com', 'birthyear': '1987', 'name': 'Jamie Smith', 'Location': 'Manchester'}
{'email': 'john@example.com', 'birthyear': '1998', 'name': 'John', 'Location': 'Manchester'}
"""
- csv 파일 쓰기
# 파이썬에서 csv 파일을 다루기 위해 모듈 import
import csv
csv_path = "sample.csv"
# csv 파일을 쓸 때는 newline='' 옵션을 줘서 중간에 공백 라인이 생기는 것을 방지합니다.
csv_file = open(csv_path, "a", encoding="utf-8", newline='')
csv_writer = csv.writer(csv_file)
# csv에 데이터를 추가합니다.
csv_writer.writerow(["lee@sparta.com", '1989', "lee", "Seoul"])
csv_file.close()
csv_file = open(csv_path, "r", encoding="utf-8")
csv_data = csv.reader(csv_file)
for i in csv_data:
print(i)
csv_file.close()
# result output
"""
...
['lee@sparta.com', '1989', 'lee', 'Seoul'] # 추가 된 행
"""
'Python' 카테고리의 다른 글
Python < 타입별 메서드 정리 > (2) | 2023.04.16 |
---|---|
파이썬 <kwargs, args / 패킹, 언패킹에 관하여> (0) | 2023.04.01 |
python 타입힌트와 데코레이터 여러 예시 (0) | 2023.04.01 |
파이썬 기초문법 8 <예외처리, finally, 모듈, 패키지> (0) | 2023.03.23 |
파이썬 기초문법7 <메소드 오버로딩, pass, super> (0) | 2023.03.23 |