
파일 다루기
파일을 다루기 위해서는 open() 및 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()그 다음 작성된 파일을 읽어보겠습니다. readLine()를 통해 한 라인씩 읽어옵니다.
f = open("새파일.txt", "r")
while True:
line = f.readLine()
if not line: break
print(line, end="")
f.close()모든 라인들을 읽어오고 싶다면, readlines()를 사용하면 됩니다.
readlines()는 라인별 텍스트를 요소로 하는 리스트로 반환해줍니다.
f = open("새파일.txt", "r")
lines = f.readlines()
print("".join(lines))
f.close()파일 객체가 Iterable한 객체이므로, 파일 객체를 기준으로 join() 함수를 사용해도 됩니다.
f = open('새파일.txt', 'r')
print("".join(f))
f.close()파일 전체를 읽어오려면, join()으로 합칠 필요없이 read()으로 읽어오면 됩니다.
f = open("새파일.txt", "r")
print(f.read())
f.close()기존 파일의 끝에 새 텍스트를 추가하려면 추가 모드를 사용하여 append()를 사용합니다.
f = open("새파일.txt", "a")
for i in range(11, 21):
f.write(f'{i} Line appened\n')
f.close()매번 close()를 처리하는 것이 까먹기 쉽다면, with 구문을 통해 자동으로 close 처리를 합니다.
with open('새파일.txt', 'r') as f:
print(f.read())with 구문은 2개 이상의 파일도 처리할 수 있습니다.
with open("새파일1.txt", "r") as f, open("새파일2.txt", "r") as g:
g.write(f.read())디렉토리 생성
다음과 같은 경로에 새 디렉토리를 생성한다고 가정합시다. 먼저 base path를 문자열로 저장합니다.
base_path = r'C:\Users\haruka\Desktop\AI수업'그리고 생성할 디렉토리도 문자열도 저장합니다.
import os
target_dir = os.path.join(base_path, 'mcp_month_1')디렉토리가 존재하는지 조사하여, 디렉토리를 실제로 만듭니다.
if not os.path.exists(target_dir):
os.makedirs(target_dir)
print("디렉토리가 생성되었습니다")
else:
print("디렉토리가 이미 존재합니다")정규 표현식
문자열 검색, 치환 등의 동작에 이어서 단순한 문자열 비교가 아니라 패턴과 비교하고자 할 때 사용합니다.
사용자가 입력한 문자열 패턴 유효성 체크 등에 주로 사용합니다.
Python에서는 re 모듈을 사용합니다.
정규 표현식에서 사용하는 표현식은 다음과 같습니다.
- ^ : 문자열의 시작
- $ : 문자열의 종료
- . : 임의의 문자
- * : 앞의 문자가 0 이상 개수가 존재할 수 있습니다.
- + : 앞의 문자가 1 이상 개수가 존재할 수 있습니다.
- ? : 앞의 문자가 없거나 하나 있을 수 있습니다.
- [ ] : 문자의 집합이나 범위를 나타냅니다.
- { } : 횟수 또는 범위를 나타냅니다.
- | : 패턴을 OR 연산할 때 사용합니다.
- \s : 공백 문자
- \S : 공백 문자가 아닌 나머지 문자
- \w : 알파벳이나 숫자
- \W : 알파벳이나 숫자를 제외한 문자
- \d : [0~9] 까지의 숫자
- \D : 숫자를 제외한 모든 문자
match() 메소드는 어떤 문자열에 정규 표현식이 매칭되는지 확인하는 메소드이며,
리턴값은 Match 객체입니다.
pattern = r'My....'
m = re.match(pattern, 'My1234') # <re.Match object; span=(0, 6), match='My1234'>여기서 Match 객체는 다음을 의미합니다.
- 어떤 문자열이 매치되었는지 알려줍니다 (match 속성)
- 매치된 문자열의 인덱스는 어디서부터 어디까지인지 알려줍니다 (span 속성)
- group() 메소드 : 매치된 문자열을 리턴합니다.
- start() 메소드 : 매치된 문자열의 시작 위치를 리턴합니다.
- end() 메소드 : 매치된 문자열의 끝 위치를 리턴합니다.
- span() 메소드 : 매치된 문자열의 (시작, 끝)에 해당하는 튜플을 리턴합니다.
m.start() # 0
m.end() # 6
m.group() # 'My1234'
m.span() # (0,6)findall() 메소드는 매칭된 문자열들을 요소로 하는 리스트를 리턴합니다.
re.findall(r'My....','asdfMy 23_asdkfMy asdfasdf Mysdafk')
# ['My 23_', 'My as', 'Mysdaf']sub() 메소드는 re.sub(pattern, replacement, str)의 형태로, 패턴 매칭되는 문자열을 치환합니다.
a = '123456-1234567'
re.sub('[0-9]','*',a) # ******-*******