3 분 소요

이 장에서 배울 것

이번 장에서는 파일 입출력(file input/output)과 텍스트 처리를 배웁니다. 입출력은 파일을 읽고 쓰는 작업입니다. 생물정보학에서 코드는 대부분 파일에서 데이터를 읽어 오고, 처리한 뒤 다시 파일로 저장합니다.

핵심 용어를 먼저 정리하겠습니다.

  • 파일 열기(open): 파일을 읽거나 쓰기 위해 연결하는 작업입니다.
  • 읽기(read): 파일 내용을 코드 안으로 가져오는 작업입니다.
  • 쓰기(write): 코드가 만든 결과를 파일에 저장하는 작업입니다.
  • 줄(line): 텍스트 파일에서 한 줄 단위의 데이터입니다.
  • 줄바꿈(newline): 줄의 끝을 나타내는 문자입니다.
  • strip: 문자열 양끝의 공백과 줄바꿈을 제거하는 기능입니다.
  • split: 문자열을 특정 기준으로 나누는 기능입니다.
  • 정규표현식(regular expression): 글자 패턴을 찾기 위한 규칙입니다. 입문 단계에서는 이름만 알아도 됩니다.
  • 인코딩(encoding): 글자를 컴퓨터가 저장하는 방식입니다.

파일 입출력과 텍스트 처리

가장 쉬운 비유: 파일은 창고, 코드는 작업자

파일은 데이터가 들어 있는 창고입니다. 코드는 창고 문을 열고, 물건을 꺼내고, 필요한 물건만 정리한 뒤, 새 창고에 다시 넣는 작업자입니다.

파일 열기 → 한 줄씩 읽기 → 필요한 정보 뽑기 → 결과 저장

이 흐름은 거의 모든 생물정보학 분석의 기본입니다.

파일 읽기

파이썬에서 파일을 읽을 때는 with open(...) as f 형태를 자주 씁니다.

with open("genes.txt") as f:
    for line in f:
        print(line)

여기서 f는 열린 파일을 가리키는 이름입니다. for line in f는 파일을 한 줄씩 읽습니다.

strip: 줄바꿈 제거

파일에서 한 줄을 읽으면 줄 끝에 줄바꿈 문자가 붙어 있을 수 있습니다. 그래서 보통 strip()을 씁니다.

with open("genes.txt") as f:
    for line in f:
        gene = line.strip()
        print(gene)

strip()은 양끝의 공백과 줄바꿈을 제거합니다.

split: 한 줄을 여러 조각으로 나누기

표 데이터는 보통 쉼표나 탭으로 값이 나뉩니다.

BRCA1,12.5
TP53,8.2

이런 줄은 split으로 나눌 수 있습니다.

line = "BRCA1,12.5"
parts = line.split(",")
print(parts[0])
print(parts[1])

결과는 BRCA112.5입니다.

탭으로 나뉜 파일은 이렇게 나눕니다.

parts = line.split("\t")

숫자로 바꾸기

파일에서 읽은 값은 처음에는 문자열입니다. 계산하려면 숫자로 바꾸어야 합니다.

value_text = "12.5"
value = float(value_text)
print(value + 1)

float는 소수점이 있는 숫자로 바꿉니다. 정수로 바꿀 때는 int를 씁니다.

파일 쓰기

결과를 파일로 저장하려면 쓰기 모드("w")로 엽니다.

with open("result.txt", "w") as f:
    f.write("BRCA1\n")
    f.write("TP53\n")

\n은 줄바꿈입니다. 이것을 넣지 않으면 글자가 한 줄에 붙어서 저장됩니다.

간단한 필터링 예시

다음 파일이 있다고 합시다.

gene,expression
BRCA1,12.5
TP53,8.2
EGFR,20.1

발현량이 10 이상인 유전자만 출력하려면 이렇게 할 수 있습니다.

with open("expression.csv") as f:
    header = next(f)
    for line in f:
        gene, value_text = line.strip().split(",")
        value = float(value_text)
        if value >= 10:
            print(gene)

여기서 next(f)는 첫 줄인 헤더를 건너뜁니다. 헤더는 열 이름이므로 숫자 계산 대상이 아닙니다.

정규표현식 맛보기

정규표현식은 글자 패턴을 찾는 도구입니다. 예를 들어 “숫자로 시작하는 줄”, “특정 형식의 샘플 이름”을 찾을 때 씁니다. 입문 단계에서는 grep이나 파이썬의 기본 문자열 기능부터 익히고, 나중에 정규표현식으로 확장하면 됩니다.

인코딩

인코딩은 글자를 저장하는 방식입니다. 영어와 숫자만 있는 생물정보 파일에서는 문제가 적지만, 한글이 들어가면 인코딩 문제가 생길 수 있습니다. 파이썬에서는 필요할 때 이렇게 명시할 수 있습니다.

with open("notes.txt", encoding="utf-8") as f:
    text = f.read()

생물정보학에서 왜 중요한가

FASTA, FASTQ, VCF, GTF 같은 파일은 정해진 규칙을 가진 텍스트 파일입니다. 생물정보학자는 이런 파일을 읽고, 특정 조건에 맞는 줄만 고르고, 필요한 열만 뽑고, 결과를 새 파일로 저장합니다. 파일 입출력과 텍스트 처리는 모든 분석의 바닥입니다.

코드 응용: 한 줄 텍스트를 데이터로 바꾸기

파일 입출력의 핵심은 “한 줄의 글자를 분석 가능한 값으로 바꾸는 것”입니다. 예를 들어 다음 한 줄이 있다고 합시다.

BRCA1,12.5

파이썬에서는 다음처럼 나눌 수 있습니다.

line = "BRCA1,12.5\n"
gene, value_text = line.strip().split(",")
value = float(value_text)
print(gene, value + 1)

strip()은 줄 끝의 줄바꿈을 제거하고, split(",")은 쉼표 기준으로 나눕니다. float는 문자열 숫자를 실제 계산 가능한 숫자로 바꿉니다.

CSV는 쉼표로 나뉜 표이고, TSV는 탭으로 나뉜 표입니다. 구분자를 잘못 쓰면 열이 제대로 나뉘지 않습니다. 예를 들어 탭 파일에 split(",")를 쓰면 한 줄 전체가 하나의 값처럼 남을 수 있습니다.

쓰기 모드 "w"는 기존 파일을 덮어쓸 수 있으므로 결과 파일 이름을 신중하게 정해야 합니다. 중요한 원본 파일에는 쓰기 모드를 사용하지 않는 습관이 안전합니다.

미니 실습 블록: 텍스트 파일에서 FASTA 길이 세기

이 실습은 텍스트 파일에서 FASTA 길이 세기를 직접 손으로 확인하는 연습입니다. 왜 필요한가 하면, 실제 분석에서는 문자열이 아니라 파일을 열어 한 줄씩 처리해야 하기 때문입니다.

lengths = {}
name = None
seq = ""

with open("mini.fasta") as f:
    for line in f:
        line = line.strip()
        if line.startswith(">"):
            if name is not None:
                lengths[name] = len(seq)
            name = line[1:]
            seq = ""
        else:
            seq = seq + line

if name is not None:
    lengths[name] = len(seq)

print(lengths)

각 코드 요소의 의미를 풀어보면 다음과 같습니다. with open(...) as f는 파일을 열고 안전하게 닫습니다. strip()은 줄 끝의 줄바꿈 문자를 제거합니다.

생물정보학/계산생물학에서 쓰이는 장면은 분명합니다. FASTA 서열 길이 계산, ID 추출, 간단한 품질 점검의 기본 패턴입니다.

흔한 오해 또는 주의점도 있습니다. FASTA 서열은 여러 줄로 나뉠 수 있으므로 header가 아닌 줄은 계속 이어 붙여야 합니다.

핵심 정리

파일 입출력은 파일을 읽고 쓰는 작업입니다. open으로 파일을 열고, for line in f로 한 줄씩 읽으며, strip으로 줄바꿈을 제거하고, split으로 값을 나눕니다. 파일에서 읽은 숫자는 문자열이므로 계산 전에 intfloat로 바꾸어야 합니다.

문제 풀이

파일 입출력과 텍스트 처리

0 / 40
Gemini AI 채점

주관식 답안은 Gemini API로 채점합니다. API 키는 이 브라우저에만 저장됩니다.

API KEY 미등록
  1. 1. [쉬움] 객관식

    파일 입출력의 의미로 적절한 것은?

    선택지
  2. 2. [코드] 객관식

    파이썬에서 파일을 한 줄씩 읽을 때 자주 쓰는 형태는?

    선택지
  3. 3. [코드] 객관식

    strip()의 역할로 적절한 것은?

    선택지
  4. 4. [코드] 객관식

    split(",")의 역할로 적절한 것은?

    선택지
  5. 5. [코드] 객관식

    line = "BRCA1,12.5"; line.split(",")[0]의 결과는?

    선택지
  6. 6. [보통] 객관식

    파일에서 읽은 "12.5"로 계산하려면 무엇이 필요한가?

    선택지
  7. 7. [코드] 객관식

    파일을 쓰기 모드로 열 때 본문에서 사용한 표시는?

    선택지
  8. 8. [쉬움] 객관식

    파이썬 문자열에서 줄바꿈을 뜻하는 표기는?

    선택지
  9. 9. [쉬움] 객관식

    CSV에서 gene,expression 같은 첫 줄은 보통 무엇인가?

    선택지
  10. 10. [코드] 객관식

    next(f)를 헤더 처리에 쓴 이유로 적절한 것은?

    선택지
  11. 11. [코드] 객관식

    탭으로 나뉜 줄을 나누려면 어떤 기준을 쓸 수 있는가?

    선택지
  12. 12. [보통] 객관식

    정규표현식의 입문용 설명으로 적절한 것은?

    선택지
  13. 13. [보통] 객관식

    인코딩(encoding)의 설명으로 적절한 것은?

    선택지
  14. 14. [코드] 객관식

    with open("result.txt", "w") as f:의 의미로 적절한 것은?

    선택지
  15. 15. [보통] 객관식

    파일에서 읽은 값이 처음에 문자열인 이유로 적절한 것은?

    선택지
  16. 16. [보통] 객관식

    발현량이 10 이상인 유전자만 고르는 코드에 필요한 기본 흐름은?

    선택지
  17. 17. [코드] 객관식

    int("12")의 결과로 적절한 것은?

    선택지
  18. 18. [계산] 객관식

    float("3.5") + 1의 결과는?

    선택지
  19. 19. [보통] 객관식

    파일 쓰기에서 줄마다 \n을 넣지 않으면 생길 수 있는 일은?

    선택지
  20. 20. [보통] 객관식

    FASTA, FASTQ, VCF, GTF를 텍스트 처리 관점에서 볼 때 적절한 설명은?

    선택지
  21. 21. [중간] 객관식

    line = "BRCA1,12.5\n"일 때 line.strip().split(",")의 결과로 맞는 것은?

    선택지
  22. 22. [중간] 객관식

    파일에서 읽은 문자열 "8.2"를 계산에 쓰려면 보통 무엇을 해야 하는가?

    선택지
  23. 23. [중간] 객관식

    CSV 첫 줄이 gene,expression일 때 이를 건너뛰는 이유로 가장 적절한 것은?

    선택지
  24. 24. [중간] 객관식

    파이썬 문자열에서 줄바꿈을 나타내는 표기로 맞는 것은?

    선택지
  25. 25. [중간] 객관식

    line = "S1\tBRCA1\t12"를 탭 기준으로 나누려면?

    선택지
  26. 26. [중간] 객관식

    쓰기 모드 "w"를 사용할 때 주의할 점은?

    선택지
  27. 27. [중간] 객관식

    다음 코드에서 출력되는 유전자는? 입력 줄들이 BRCA1,12.5, TP53,8.2, EGFR,20.1이고 조건은 value >= 10이다.

    선택지
  28. 28. [중간] 객관식

    TSV 파일에 쉼표 기준 split(",")를 쓰면 생길 수 있는 문제는?

    선택지
  29. 29. [실전] 객관식

    line = line.strip()을 쓰는 이유는?

    선택지
  30. 30. [실전] 객관식

    FASTA 서열이 여러 줄인데 각 줄마다 따로 길이를 계산하면 생길 문제는?

    선택지
  31. 주관식 31. [실습] 주관식 · Gemini 채점

    genes.txt 파일을 한 줄씩 읽고 줄바꿈을 제거해 출력하는 코드를 작성하라.

  32. 주관식 32. [실습] 주관식 · Gemini 채점

    문자열 "BRCA1,12.5"를 쉼표로 나누고 유전자 이름과 값을 각각 변수에 저장하는 코드를 작성하라.

  33. 주관식 33. [실습] 주관식 · Gemini 채점

    value_text = "12.5"를 숫자로 바꾼 뒤 1을 더해 출력하는 코드를 작성하라.

  34. 주관식 34. [실습] 주관식 · Gemini 채점

    result.txtBRCA1TP53을 한 줄씩 저장하는 코드를 작성하라.

  35. 주관식 35. [실습] 주관식 · Gemini 채점

    CSV 파일에서 첫 줄 헤더를 건너뛰어야 하는 이유를 설명하라.

  36. 주관식 36. [실습] 주관식 · Gemini 채점

    파일 입출력이 생물정보학 분석의 기본인 이유를 설명하라.

  37. 주관식 37. [실습] 주관식 · Gemini 채점

    expression.csv에서 헤더를 건너뛰고 발현량이 10 이상인 유전자만 출력하는 코드의 핵심 흐름을 설명하라.

  38. 주관식 38. [실습] 주관식 · Gemini 채점

    CSV와 TSV를 처리할 때 구분자를 잘못 쓰면 어떤 문제가 생기는지 예시와 함께 설명하라.

  39. 주관식 39. [실습] 주관식 · Gemini 채점

    mini.fasta를 한 줄씩 읽고 strip()해서 출력하는 코드를 작성하라.

  40. 주관식 40. [실습] 주관식 · Gemini 채점

    FASTA 길이가 예상보다 record마다 1씩 크게 나왔다. 가능한 원인과 해결을 설명하라.