개발일기

#8 파이썬 심화 (정규표현식, 파일과 디렉토리, csv파일 다루기) 본문

오늘의 공부일기/파이썬 공부일기

#8 파이썬 심화 (정규표현식, 파일과 디렉토리, csv파일 다루기)

츄98 2023. 3. 24. 13:13

상식으로 알아두기~

1. 정규표현식

  • regular expression의 약자인 regex라고도 한다.
  • 문자열이 특정 패턴과 일치하는지 판단하는 형식 언어!
  • 예를 들어 사용자가 입력한 이메일이 유효한 이메일인지, 휴대폰 번호가 유효한 번호인지 등등 다양한 패턴을 지정하고 검증할 수 있다.
  • 직접 정규표현식을 짜는 건 너무 어려운 일이다.
  • 이미 만들어져 있는 검증된 정규표현식을 가져다가 쓰도록 하자!
from pprint import pprint
import re
# 정규표현식 사용해서 이메일 검증하기
# ^[\w\.-]+@([\w-]+\.)+[\w-]{2,4}$ : 이메일 검증을 위한 정규표현식 코드
email_regex = re.compile(r"^[\w\.-]+@([\w-]+\.)+[\w-]{2,4}$")

# test = "\n\t"에서 \n.은 개행을 의미하고, \t는 탭을 의미한다.
# test = r"\n\t"을 하면 \n, \t같은 문자를 특수 문자가 아니라 온전히 문자 그대로 사용할 수 있다.
# 즉 앞에 r을 붙이는 이유는 정규표현식에서 특정문자를 특수문자로 인식하는 것을 방지하기 위해 붙인 것이다.

def verify_email(email):
    return bool(email_regex.fullmatch(email))

result = [{x: verify_email(x)} for x in test_case] #test_case는 리스트

pprint(result)

https://regexr.com/

 

RegExr: Learn, Build, & Test RegEx

RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).

regexr.com

 

2. 파일과 디렉토리 다루기

  • glob을 활용한 파일 및 디렉토리 목록 확인
  • glob을 사용할 때는 import glob를 해줘야한다.
  • glob.glob를 쓴 다음에 어떤 경로에 있는 파일들을 볼 건지 적으면 된다.
  • 윈도우에서는 기본적으로 경로를 표시할 때 \를 사용하므로 /랑 \가 섞여서 나온다.
  • 경로가 /와 \로 섞여서 나온 경우, 만약 이 파일들을 사용한다 하면 replace를 시켜서 통일시키는 것이 안전하다.
  • glob는 기본적으로 하위폴더를 탐색하지 않는다.
  • 하위폴더까지 탐색하기 원한다면 recursive = "True"를 사용하면 된다.
  • *일 때는 recursive 플래그가 True로 설정되어 있다고 하더라도 재귀적으로 돌지 않는다.
  • 모든 하위폴더와 파일들을 탐색하고 싶다면 recursive와 **를 같이 사용해야 한다.
  • 만약 파이썬 확장자를 가진 파일들만 사용하고 싶다면, (즉 어떤 조건을 만족하는 파일들을 사용하고 싶다면) 별 뒤에 특정 키워드를 적어주면 된다. path = glob.glob("./venv/**/*.py", recursive = True) 이렇게~
import glob

# ./는 현재 python 파일이 위치한 경로를 의미한다.
# *은 "모든 문자가 일치한다" 라는 의미를 가지고 있다.
# ./venv/*은 venv 폴더 내 모든 파일들을 의미한다.
path = glob.glob("./venv/*")

# **은 해당 경로 하위 모든 파일을 의미하며, recursive 플래그와 같이 사용한다.
# recursive를 True로 설정하면 디렉토리 내부의 파일들을 재귀적으로 탐색한다.
path = glob.glob("./venv/**", recursive=True)

# *.py와 같이 작성 시 특정 확장자를 가진 파일들만 볼 수 있다.
# ./venv/**/*.py는 venv 하위 모든 폴더들을 재귀적으로 탐색하며 .py 확장자 파일을 탐색한다.
path = glob.glob("./venv/**/*.py", recursive=True)
  • 파일열기는 open을 사용함
  • open  뒤에 어떤 파일을 열건지 해당 파일의 경로와 파일이름을 지정해주면 된다.
  • 경로없이 파일이름만 쓰게 된다면 실행하는 파이썬 파일의 경로와 똑같은 위치에 파일을 열겠다는 의미
  • 그리고 어떤 모드로 열것인지 지정해주면 된다. "w"는 쓰기모드, "r"은 읽기모드, "a"는 추가모드
  • 추가모드는 "a" 다음에 파일에  encoding을 지정해줘야한다.
  • encoding을 지정하지 않거나 잘못된 encoding을 지정한 경우에는 파일을 읽고 쓸 때 글자가 깨질 수 있다.
  • 보통  utf-8로 지정하면 문제가 없다.
  • f.write(파일에 원하는 내용을 작성해준다.)
  • "w"는 파일에 내용이 있고 없고와 관계없이 처음부터 새로 쓴다.
  • "a"는 추가모드이므로 기존내용이 존재한다면 기존 내용을 유지한 채로 새로운 내용을 추가한다.
# "file.txt" : 파이썬에서 사용할 파일을 지정한다.
# encoding : 파일의 encoding 형식을 지정한다.

# case 1. open 함수를 사용해 파일 열기
f = open("file.txt", "w", encoding="utf-8")
f.write("파이썬 파일 쓰기 테스트!\n")

# open 함수를 실행하면 python 스크립트가 끝날때 까지 파일이 열려있게 된다.
# 때문에 파일에 대한 작업이 끝나면 close()를 사용해 파일을 닫아줘야 한다.
f.close()

# python에서는 파일을 편집하거나 생성할 때, with open 문법을 사용할 수 있다.
# open을 with와 같이 사용하면 with 구문이 끝날 때 자동으로 파일이 close 된다.
# 때문에 with를 사용할 떄는 별도로 close 해주지 않아도 된다.
# with open(file) as r : 오픈한 파일이 뒤에 있는 변수 r에 담긴다.
with open("file.txt", "a", encoding="utf-8") as w:
    w.write("파이썬 내용 추가 테스트!")

with open("file.txt", "r", encoding="utf-8") as r:
    # readlines는 파일의 모든 내용을 list 자료형으로 한번에 읽어들인다.
    print(r.readlines())
    
with open("file.txt", "r", encoding="utf-8") as r:
    while True:
        # readline은 파일을 한 줄 씩 읽어들인다.
        line = r.readline()

        # 파일 끝까지 텍스트를 읽어들였다면 반복문을 중지한다.
        if not line:
            break

        # 텍스트의 줄바꿈 문자 제거
        line = line.strip()
        print(line)
  • 파일을 오픈하고 여기저기서 많이 쓰거나 많이 읽어야한다면 오픈변수에 할당하는 방법이 좋다.
  • 그러나 잠깐 쓰거나 읽고 끝낼 거라면  with open문법을 사용하는 것이 더 깔끔하기도 하고 휴먼에러로 파일을 클로즈하지 않아서 생기는 이슈를 방지할 수도 있다.

파일 열기 open에서 "w", "r", "a" 이외의 모드를 확인하고 싶다면, 여기서 확인할 수 있다.

https://docs.python.org/ko/3/library/functions.html?highlight=open#open

 

Built-in Functions

The Python interpreter has a number of functions and types built into it that are always available. They are listed here in alphabetical order.,,,, Built-in Functions,,, A, abs(), aiter(), all(), a...

docs.python.org

 

docs에 보니 open말고도 다양한 문법들의 사용법이 잘 나와있는 것 같다.

구글링을 통해서 블로그에서 확인하는 것보다 docs를 정독하고.. 이해하고.. 자주 들여다보는 것이 개발자에게 좋은 자세라고 한다. 영어도 많고 좀 읽기 싫게 생겼지만, 정확한 정보들이기 때문에 자주 들여다보아야겠다.

 

3. csv 파일

  • csv는 엑셀과 다르게 단순 텍스트다.
  • 별다른 툴 없이 텍스트 편집기를 사용해 간단한 csv파일을 만드는 것도 가능하다.
  • 단순 텍스트이기 때문에 읽고 쓰는 속도가 빠르다.
  • csv_path: csv 파일의 경로를 지정해준다. 경로를 지정하지 않으면 실행되는 파이썬 파일과 동일한 위치에 있는 파일을 찾아간다. 만약 다른 폴더의 파일이라면 앞에 경로를 지정해줘야한다.
  • csv_file = open(csv_path, "r", encoding = "utf-8")
    일반 텍스트 파일을 읽어들이는 것
# 파이썬에서 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) 읽어들인 파일을 지정하면 그때 데이터를 csv로 읽어들일 수 있다.
# csv.reader함수를 사용하면 리스트 형태로 읽어들인다.
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()

# csv를 dict 자료형으로 읽기
# csv.DictReader함수를 사용하면 딕셔너리 형태로 읽겠다.
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()

# csv 파일을 쓸 때는 newline='' 옵션을 줘서 중간에 공백 라인이 생기는 것을 방지한다.
csv_file = open(csv_path, "a", encoding="utf-8", newline='')

# csv에 데이터를 추가한다.
# csv.writer()을 사용하여 내용 추가, writerow를 사용해서 어떤 내용을 추가할 건지 적기
csv_writer = csv.writer(csv_file)
csv_writer.writerow(["lee@sparta.com", '1989', "lee", "Seoul"])

csv_file.close()