MCP - 6일차(파일 & 정규표현식)

Jun·2026년 1월 31일

MCP

목록 보기
8/20

📂 Python 기초: 파일(file) 다루기 및 디렉토리 관리

파이썬에서 파일을 생성하고 읽고 쓰는 기본 방법과 os 모듈을 활용한 디렉토리 관리법을 정리합니다.


1. 파일 생성하기 및 열기 모드

파일을 다룰 때는 open() 함수로 파일을 열고, 작업이 끝나면 close() 함수로 닫아주는 것이 기본입니다.

    # 파일객체 = open(파일 이름, 파일 열기 모드)
    # ... 파일객체사용 (읽기 or 쓰기)
    # 파일객체.close()

📍 파일 열기 모드

  • r (읽기모드): 파일을 읽기만 할 때 사용.
  • w (쓰기모드): 파일에 내용을 쓸 때 사용. 파일이 없으면 새로 생성하고, 있으면 기존 내용을 삭제 후 생성.
  • a (추가모드): 파일 마지막에 내용을 추가할 때 사용. 파일이 없으면 새로 생성.

쓰기 모드로 파일 열기 예시

f = open('새파일.txt', 'w')
f.close()

2. 파일에 내용 쓰기 (write)

반복문을 활용하여 파일에 여러 줄의 내용을 작성할 수 있습니다.

    f = open("새파일.txt", "w")
    for i in range(1, 11):
        f.write(f'Line {i}\n')
    f.close()

    # !cat 새파일.txt (Colab에서 내용 바로 확인 가능)
    
# 출력 결과    
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10    
    

3. 파일 읽기 (read)

다양한 메서드를 통해 파일 내용을 불러올 수 있습니다.

🔹 readline()

한 줄씩 읽어오며, 더 이상 읽을 라인이 없으면 None을 리턴합니다.

    f = open("새파일.txt", "r")
    while True:
        line = f.readline()
        if not line: break
        print(line, end='')
    f.close()
    
# 출력 결과
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10

🔹 readlines()

파일의 모든 라인을 리스트 형태로 읽어옵니다.

    f = open("새파일.txt", "r")
    lines = f.readlines()
    print(''.join(lines))
    f.close()
readlines() + ''.join() 방식

#출력 과정
파일 내용: A\nB\nC
f.readlines() 결과: ["A\n", "B\n", "C"] (리스트)

''.join()으로 합친 결과: "A\nB\nC" (다시 문자열로 변신!)

print() 결과:

A
B
C

🔹 read()

파일 전체 내용을 하나의 문자열로 읽어옵니다.

    f = open("새파일.txt", "r")
    print(f.read())
    f.close()
    
#출력 과정    
파일 내용: A\nB\nC
f.read() 결과: "A\nB\nC" (문자열)

print() 결과:

A
B
C

4. 내용 추가하기 (append)

기존 내용을 유지하면서 새로운 내용을 덧붙일 때 a 모드를 사용합니다.

f = open("새파일.txt", "a")
for i in range(11, 21):
    f.write(f'{i} Line appended\n')
f.close()

5. with 구문 활용

with 구문을 사용하면 블록이 끝날 때 자동으로 파일을 닫아주므로 close()를 생략할 수 있어 편리하고 안전합니다.

    with open('새파일.txt', 'r') as f:
        print(f.read())

#출력 결과
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
11 Line appended #append된 이후 
12 Line appended
13 Line appended
14 Line appended
15 Line appended
16 Line appended
17 Line appended
18 Line appended
19 Line appended
20 Line appended


6. 디렉토리 생성 및 관리

os 모듈을 사용하여 경로를 지정하고 폴더를 생성할 수 있습니다.

    base_path = r'/content/drive/MyDrive/MCP_1700' 
    
    import os
    
    target_dir = os.path.join(base_path, 'out')
	target_dir # /content/drive/MyDrive/MCP_1700/out
    
    # 경로 존재 여부 확인 및 생성
    if not os.path.exists(target_dir):
        os.mkdir(target_dir)
        print('디렉토리 생성 완료')
    else:
        print('디렉토리가 이미 존재합니다')
        

    # 파일 생성 예시
    target_file = os.path.join(target_dir, 'test.txt')
    with open(target_file, 'w') as f:
        for i in range(1, 11):
            f.write(f'{i} 번째 줄입니다\n')

💡 참고: Colab 환경에서 생성한 파일은 세션 연결이 끊어지면 소멸되므로, 중요한 파일은 구글 드라이브를 마운트하여 저장해야 합니다.


7. 인코딩(encoding) 설정

운영체제마다 기본 인코딩이 다를 수 있으므로(Windows: cp949, Linux/Mac: utf8), 한글 깨짐 방지를 위해 encoding 옵션을 명시해주는 것이 좋습니다.

# cp949 인코딩으로 쓰기
with open(os.path.join(target_dir, 'test2.txt'), 'w', encoding='cp949') as f:
    for i in range(1, 11):
        f.write(f'{i} 번째 줄입니다\n')

# 읽기 시 에러 무시 옵션 활용
with open(os.path.join(target_dir, 'test2.txt'), 'r', errors='ignore') as f:
    print(f.read())

🔍 Python 심화: 정규표현식(Regular Expression) 완벽 정리

문자열을 단순히 비교하는 것을 넘어, 특정 '패턴'을 찾아내어 매칭(Pattern Matching)하는 정규표현식의 기초와 활용법을 정리합니다.


1. 정규표현식이란?

  • 용도: 이메일, 전화번호, 비밀번호 유효성 체크, 특정 형식의 날짜 추출 등.
  • 장점: 코딩량 대폭 감소, 대부분의 프로그래밍 언어에서 공용으로 사용 가능.
  • 단점: 초기 학습 난이도가 높고 가독성이 떨어질 수 있음.

🌐 연습하기 좋은 사이트


2. 정규표현식 문법 기호 요약

    ^  : 문자열의 시작
    $  : 문자열의 종료
    .  : 임의의 문자 하나 (줄바꿈 제외)
    * : 앞 문자가 0개 이상 반복
    +  : 앞 문자가 1개 이상 반복
    ?  : 앞 문자가 0개 또는 1개 존재
    [] : 문자의 집합 또는 범위 ([a-z], [0-9])
    {} : 반복 횟수 지정 ({n}, {n, m})
    () : 그룹화
    |  : OR 연산

    \s : 공백 문자 / \S : 공백 아닌 문자
    \w : 알파벳 + 숫자 + _ (언더바) / \W : \w가 아닌 것
    \d : 숫자 ([0-9]) / \D : 숫자가 아닌 것

3. Python re 모듈 활용하기

파이썬에서는 re 모듈을 임포트하여 사용합니다.

    import re

    # 예시 패턴: 'My'로 시작하고 뒤에 문자 4개가 붙는 패턴
    pat = r'My....'  
    # My1234, Myabcd, Myaaaaaaaaa, MMMMMMMMyyyyyyyyy (OK)  My10 (X)

① re.match()

문자열의 처음부터 패턴이 매칭되는지 확인합니다. 매칭되면 Match 객체를 반환합니다.

m = re.match(pat, 'My1234')
# <re.Match object; span=(0, 6), match='My1234'>

📍 Match 객체의 주요 메서드

m.group()  # 매치된 문자열 리턴 ('My1234')
m.start()  # 시작 인덱스 리턴 (0)
m.end()    # 끝 인덱스 리턴 (6)
m.span()   # (시작, 끝) 튜플 리턴 (0, 6)
m.group() # My1234
m.start()  # 0
m.end()  # 6 
m.span() # (0, 6)

② re.findall()

패턴과 매칭되는 모든 부분을 찾아 리스트(list)로 반환합니다.

    # 소문자가 한 번 이상 연속해서(+) 나오는 덩어리를 찾아.
    re.findall('[a-z]+', 'a100b300def500') 
    # 결과: ['a', 'b', 'def']


    # 소문자 a부터 z까지 중에 딱 한 글자만 찾아줘."
    re.findall('[a-z]', 'a100b300def500')
    # 결과: ['a', 'b', 'd', 'e', 'f']
    
    
	re.findall(pat, 'asdfMy 23_asdkfMy  asdfasdf Mysdafk')
	# 결과: ['My 23_', 'My  as', 'Mysdaf']


	# 한글자(\w) 단위로 추출
	re.findall(r'\w', 'life is too short')
	# 결과: ['l', 'i', 'f', 'e', 'i', 's', 't', 'o', 'o', 's', 'h', 'o', 'r', 't']
    
    
    # 단어(\w) 단위로 추출
    re.findall(r'\w+', 'life is too short') 
    # 결과: ['life', 'is', 'too', 'short']
    
    
    #두글자 단위로 추출
    re.findall(r'[\w]{2}', 'life is too short')
    # 결과: ['li', 'fe', 'is', 'to', 'sh', 'or']

③ re.sub()

패턴과 매칭되는 부분을 다른 문자열로 치환합니다.

    # 숫자를 모두 *로 가리기
    a = "123456-1234567"
    re.sub('[0-9]', '*', a) 
    # 결과: '******-*******'

4. 실전 예제: 숫자만 추출하기

문자열에서 숫자가 아닌 것들을 모두 제거하여 순수 정수 값만 뽑아내는 방법입니다.

    b = "정가 14,500원"

    # \D(숫자가 아닌 것)를 찾아 빈 문자열('')로 치환
    result = int(re.sub(r'\D', '', b))

    print(result) # 결과: 14500

📍 활용 팁

  • \d: 숫자만 찾기
  • \D: 숫자가 아닌 것만 찾기
  • 웹 크롤링 시 가격 데이터에 포함된 , ,, (주) 등의 불필요한 문자를 한 번에 제거할 때 매우 유용합니다.
      
profile
Hard Trying

0개의 댓글