변수 범위 (Scope)
변수가 접근 가능한 범위를 스코프(scope)라고 합니다. 파이썬은 LEGB 규칙에 따라 변수를 탐색합니다.
LEGB 규칙
| 범위 | 설명 |
| Local | 현재 함수 안 |
| Enclosing | 감싸고 있는 함수 안 (중첩 함수에서) |
| Global | 모듈 최상위 레벨 |
| Built-in | 파이썬 내장 이름 (len, print 등) |
변수를 참조할 때 Local → Enclosing → Global → Built-in 순서로 탐색하며, 가장 먼저 찾은 것을 사용합니다.
로컬 변수와 글로벌 변수
count = 100 # 글로벌 변수
def process():
count = 10 # 로컬 변수 (글로벌 변수와 별개)
print(count) # 10
process()
print(count) # 100 (글로벌 변수는 변경되지 않음)
함수 안에서 글로벌 변수를 읽는 것은 가능하지만, 수정하려면 global 키워드가 필요합니다.
count = 0
def increment():
global count
count += 1
increment()
increment()
print(count) # 2
global을 남용하면 코드가 어느 곳에서 변수를 변경하는지 추적하기 어려워집니다.
함수는 필요한 값을 인자로 받고 결과를 반환하는 방식이 더 권장됩니다.
nonlocal
중첩 함수에서 바깥 함수의 변수를 수정할 때 사용합니다.
def outer():
count = 0
def inner():
nonlocal count
count += 1
inner()
inner()
print(count) # 2
outer()
스코프 주의사항
함수 안에서 한 번이라도 변수에 값을 할당하면, 그 변수는 함수 전체에서 지역 변수로 취급됩니다. 할당 전에 참조하면 오류가 발생합니다.
count = 100
def process():
print(count) # UnboundLocalError
count = 10 # 이 줄 때문에 count가 지역 변수로 취급됨
파일 읽기·쓰기
파일 열기: open()
f = open("file.txt", "r") # 읽기 모드로 열기
# 작업 수행
f.close() # 반드시 닫아야 함
파일을 열면 반드시 닫아야 합니다. close()를 빠뜨리거나 중간에 오류가 발생하면 파일이 닫히지 않을 수 있습니다. with 문을 사용하면 블록을 벗어날 때 자동으로 파일이 닫힙니다.
with open("file.txt", "r") as f:
content = f.read()
# with 블록을 벗어나면 자동으로 f.close() 호출
파일 열기 모드
| 모드 | 의미 |
| r | 읽기 (기본값, 파일 없으면 오류) |
| w | 쓰기 (파일 없으면 생성, 있으면 덮어씀) |
| a | 추가 쓰기 (파일 없으면 생성, 있으면 끝에 이어씀) |
| x | 쓰기 (파일이 이미 있으면 오류) |
| rb / wb | 바이너리 읽기 / 쓰기 |
파일 읽기
# 전체 내용을 문자열로 읽기
with open("sample.txt", "r") as f:
content = f.read()
print(content)
# 한 줄씩 읽기 (가장 많이 사용)
with open("sample.txt", "r") as f:
for line in f:
print(line.strip()) # 줄 끝 개행 문자 제거
# 모든 줄을 리스트로 읽기
with open("sample.txt", "r") as f:
lines = f.readlines()
# 한 줄만 읽기
with open("sample.txt", "r") as f:
first_line = f.readline()
대용량 파일을 다룰 때는 f.read()로 전체를 한 번에 읽으면 메모리 문제가 생길 수 있습니다.
for line in f:로 줄 단위로 읽는 방식이 메모리 효율이 좋습니다.
# FASTA 파일 파싱 예시
with open("sequences.fasta", "r") as f:
current_header = None
for line in f:
line = line.strip()
if line.startswith(">"):
current_header = line[1:] # > 제거
else:
print(f"{current_header}: {len(line)}bp")
파일 쓰기
# 파일 쓰기 (덮어쓰기)
with open("output.txt", "w") as f:
f.write("Sample: sample_01\n")
f.write("Coverage: 30.5x\n")
# 여러 줄 한꺼번에 쓰기
lines = ["BRCA1\t12.5\n", "TP53\t8.3\n", "EGFR\t21.0\n"]
with open("expression.tsv", "w") as f:
f.writelines(lines)
# 파일 끝에 이어서 쓰기
with open("output.txt", "a") as f:
f.write("새로운 줄 추가\n")
f.write()는 자동으로 줄바꿈을 추가하지 않습니다. 줄바꿈이 필요하면 \n을 직접 붙여야 합니다.
print()로 파일에 쓰기
print() 함수의 file 옵션으로 파일에 출력할 수 있습니다. \n을 직접 붙이지 않아도 됩니다.
with open("output.txt", "w") as f:
print("Sample: sample_01", file=f)
print(f"Coverage: {30.5}x", file=f)
인코딩 지정
한글이 포함된 파일을 다루거나 서버 환경에서 인코딩 오류가 발생하면 인코딩을 명시합니다.
with open("file.txt", "r", encoding="utf-8") as f:
content = f.read()
with open("output.txt", "w", encoding="utf-8") as f:
f.write("한글 내용\n")
CSV 파일 다루기
구분자가 있는 텍스트 파일은 csv 모듈을 사용하면 편리합니다.
import csv
# CSV 읽기
with open("data.csv", "r") as f:
reader = csv.reader(f)
header = next(reader) # 첫 줄(헤더) 읽기
for row in reader:
print(row) # 각 행이 리스트로 반환
# 딕셔너리로 읽기 (헤더를 키로 사용)
with open("data.csv", "r") as f:
reader = csv.DictReader(f)
for row in reader:
print(row["sample_id"], row["coverage"])
# CSV 쓰기
with open("output.csv", "w", newline="") as f:
writer = csv.writer(f)
writer.writerow(["sample_id", "coverage", "gc_content"])
writer.writerow(["sample_01", 30.5, 0.512])
writer.writerow(["sample_02", 22.1, 0.488])
CSV 파일을 쓸 때 newline=""을 지정하지 않으면 윈도우 환경에서 빈 줄이 삽입되는 문제가 생길 수 있습니다.
파일 존재 여부 확인
파일을 열기 전에 존재 여부를 확인할 때는 os.path 또는 pathlib을 사용합니다.
import os
if os.path.exists("data.csv"):
with open("data.csv", "r") as f:
content = f.read()
else:
print("파일이 존재하지 않습니다.")
# pathlib 사용 (파이썬 3.4 이상, 더 직관적)
from pathlib import Path
path = Path("data.csv")
if path.exists():
content = path.read_text()
예외 처리와 함께 사용
파일 처리에서는 파일이 없거나 권한 문제가 있을 수 있어 예외 처리를 함께 사용하는 것이 좋습니다.
try:
with open("data.csv", "r") as f:
content = f.read()
except FileNotFoundError:
print("파일을 찾을 수 없습니다.")
except PermissionError:
print("파일을 읽을 권한이 없습니다.")
정리표
| 항목 | 설명 |
| global | 함수 안에서 전역 변수 수정 시 선언 |
| nonlocal | 중첩 함수에서 바깥 함수 변수 수정 시 선언 |
| with open(...) | 파일 열기, 블록 종료 시 자동으로 닫힘 |
| f.read() | 파일 전체를 문자열로 읽기 |
| for line in f | 줄 단위로 읽기 (대용량 파일에 적합) |
| f.readlines() | 모든 줄을 리스트로 읽기 |
| f.write() | 파일에 쓰기 (\n 직접 추가 필요) |
| csv.reader | CSV 파일 읽기 |
| csv.DictReader | CSV를 딕셔너리로 읽기 |
'BI&Programming-Tools > Python' 카테고리의 다른 글
| [파이썬 기초] 클래스, 모듈, 예외처리 (0) | 2026.06.18 |
|---|---|
| [파이썬 기초] 파일 형식 처리 (CSV, TSV, FASTA) (0) | 2026.06.17 |
| [파이썬 기초] 정규표현식 (re 모듈) (0) | 2026.06.17 |
| [파이썬 기초] 함수 정의와 인자 (*args, **kwargs) (0) | 2026.06.16 |
| [파이썬 기초] 람다 함수와 내장 함수, collections 모듈 (0) | 2026.06.16 |
