[파이썬 기초] 변수 범위와 파일 읽기·쓰기

2026. 6. 17. 19:00·BI&Programming-Tools/Python

변수 범위 (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
'BI&Programming-Tools/Python' 카테고리의 다른 글
  • [파이썬 기초] 클래스, 모듈, 예외처리
  • [파이썬 기초] 파일 형식 처리 (CSV, TSV, FASTA)
  • [파이썬 기초] 정규표현식 (re 모듈)
  • [파이썬 기초] 함수 정의와 인자 (*args, **kwargs)
데이터로 읽는 생명
데이터로 읽는 생명
is-note 님의 블로그 입니다.
  • 데이터로 읽는 생명
    In Silico Note
    데이터로 읽는 생명
  • 전체
    오늘
    어제
    • 분류 전체보기 (190)
      • Bio-Knowledge (16)
        • 분자생물학 & 유전학 기초 (0)
        • 전사체학 & 유전자 발현 (0)
        • 구조생물학 & 단백질 (0)
        • 싱글셀 & 다중오믹스 (0)
        • 임상유전학 & 질환 데이터 (0)
      • Programming (4)
        • API (4)
      • BI&Programming-Tools (111)
        • File Formats (14)
        • Linux & Bash Script (38)
        • Python (35)
        • R (11)
        • 통계 (8)
        • Pipeline Manager (0)
        • Etc (5)
      • Bio Data Analysis (28)
        • 서열분석개론 (6)
        • WGS(Whole Genome Seq) (11)
        • WES(Whole Exome Seq) (2)
        • RNA-Seq (4)
        • Metagenome (2)
        • Non-human Resequencing (1)
        • 임상유전체 분석 (1)
        • Multi-Omics (1)
      • Bio-Trends & Tech (1)
      • 코딩테스트 연습 (30)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    생물정보학
    파이썬
    리눅스기초
    데이터분석
    ngs
    분자생물학
    FASTQ
    리눅스
    R기초
    fasta
    유전체분석
    파이썬기초
    wgs
    R
    GATK
    파일포맷
    bioinformatics
    파이썬연습
    코딩테스트
    통계
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
데이터로 읽는 생명
[파이썬 기초] 변수 범위와 파일 읽기·쓰기
상단으로

티스토리툴바