파이썬에서 파일을 생성하고 읽고 쓰는 기본 방법과 os 모듈을 활용한 디렉토리 관리법을 정리합니다.
파일을 다룰 때는 open() 함수로 파일을 열고, 작업이 끝나면 close() 함수로 닫아주는 것이 기본입니다.
# 파일객체 = open(파일 이름, 파일 열기 모드)
# ... 파일객체사용 (읽기 or 쓰기)
# 파일객체.close()
쓰기 모드로 파일 열기 예시
f = open('새파일.txt', 'w')
f.close()
반복문을 활용하여 파일에 여러 줄의 내용을 작성할 수 있습니다.
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
다양한 메서드를 통해 파일 내용을 불러올 수 있습니다.
한 줄씩 읽어오며, 더 이상 읽을 라인이 없으면 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
파일의 모든 라인을 리스트 형태로 읽어옵니다.
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
파일 전체 내용을 하나의 문자열로 읽어옵니다.
f = open("새파일.txt", "r")
print(f.read())
f.close()
#출력 과정
파일 내용: A\nB\nC
f.read() 결과: "A\nB\nC" (문자열)
print() 결과:
A
B
C
기존 내용을 유지하면서 새로운 내용을 덧붙일 때 a 모드를 사용합니다.
f = open("새파일.txt", "a")
for i in range(11, 21):
f.write(f'{i} Line appended\n')
f.close()
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
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 환경에서 생성한 파일은 세션 연결이 끊어지면 소멸되므로, 중요한 파일은 구글 드라이브를 마운트하여 저장해야 합니다.
운영체제마다 기본 인코딩이 다를 수 있으므로(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())
문자열을 단순히 비교하는 것을 넘어, 특정 '패턴'을 찾아내어 매칭(Pattern Matching)하는 정규표현식의 기초와 활용법을 정리합니다.
^ : 문자열의 시작
$ : 문자열의 종료
. : 임의의 문자 하나 (줄바꿈 제외)
* : 앞 문자가 0개 이상 반복
+ : 앞 문자가 1개 이상 반복
? : 앞 문자가 0개 또는 1개 존재
[] : 문자의 집합 또는 범위 ([a-z], [0-9] 등)
{} : 반복 횟수 지정 ({n}, {n, m})
() : 그룹화
| : OR 연산
\s : 공백 문자 / \S : 공백 아닌 문자
\w : 알파벳 + 숫자 + _ (언더바) / \W : \w가 아닌 것
\d : 숫자 ([0-9]) / \D : 숫자가 아닌 것
파이썬에서는 re 모듈을 임포트하여 사용합니다.
import re
# 예시 패턴: 'My'로 시작하고 뒤에 문자 4개가 붙는 패턴
pat = r'My....'
# My1234, Myabcd, Myaaaaaaaaa, MMMMMMMMyyyyyyyyy (OK) My10 (X)
문자열의 처음부터 패턴이 매칭되는지 확인합니다. 매칭되면 Match 객체를 반환합니다.
m = re.match(pat, 'My1234')
# <re.Match object; span=(0, 6), match='My1234'>
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)
패턴과 매칭되는 모든 부분을 찾아 리스트(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']
패턴과 매칭되는 부분을 다른 문자열로 치환합니다.
# 숫자를 모두 *로 가리기
a = "123456-1234567"
re.sub('[0-9]', '*', a)
# 결과: '******-*******'
문자열에서 숫자가 아닌 것들을 모두 제거하여 순수 정수 값만 뽑아내는 방법입니다.
b = "정가 14,500원"
# \D(숫자가 아닌 것)를 찾아 빈 문자열('')로 치환
result = int(re.sub(r'\D', '', b))
print(result) # 결과: 14500
원, ,, (주) 등의 불필요한 문자를 한 번에 제거할 때 매우 유용합니다.