BioPlayground

🧬
목록으로

Python으로 실험 데이터 파일 읽고 쓰기

Python으로 CSV/TSV 실험 데이터를 읽고 쓰는 법. 바이오 연구자를 위한 파일 처리 입문.

입문
|
60
|
검증 완료 (2026-06)
CSV파일 입출력실험 데이터TSV파싱open
트랙 진행률0/6 (0%)

Python으로 실험 데이터 파일 읽고 쓰기

이 토픽을 마치면

Python으로 텍스트 파일과 CSV 파일을 읽고, 데이터를 필터링하고, 결과를 새 파일로 저장할 수 있습니다.


왜 파일 입출력이 중요한가

실험 데이터는 결국 파일입니다. 장비에서 CSV로 내보내고, 분석 결과를 텍스트로 저장하고, 다른 연구자에게 파일로 공유합니다. 엑셀로 열 수도 있지만, 시료가 수천 개면 손으로 하기 어렵습니다.

Python으로 파일을 다루면 — 1만 줄짜리 CSV에서 조건에 맞는 시료만 추출하는 작업이 코드 5줄로 끝납니다.

텍스트 파일 읽기: open()

Python에서 파일을 읽는 가장 기본적인 방법입니다.

python
with open("protocol.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)

핵심 키워드:

  • open("파일명", "모드") — 파일을 여는 함수
  • "r" — 읽기 모드 (read)
  • encoding="utf-8" — 한글이 깨지지 않게
  • with ... as f: — 파일을 안전하게 열고, 블록이 끝나면 자동으로 닫아줌

with를 쓰지 않으면 f.close()를 직접 호출해야 합니다. 실험 후 장비 전원을 끄듯, 파일도 사용 후 닫아야 합니다. with는 이것을 자동으로 해줍니다.

파일 모드 정리

모드의미비유
"r"읽기 (기본값)실험 노트를 펼쳐서 읽기
"w"쓰기 (기존 내용 덮어씀)새 노트에 처음부터 쓰기
"a"추가 (기존 내용 뒤에 이어씀)기존 노트 마지막 페이지에 추가

"w" 모드를 쓸 때 조심하세요 — 기존 파일 내용이 전부 사라집니다. 이전 데이터를 보존하면서 추가하려면 "a" 모드를 쓰세요.

줄 단위로 읽기

파일을 한 줄씩 처리하고 싶을 때:

python
with open("samples.txt", "r", encoding="utf-8") as f:
for line in f:
line = line.strip()
if line:
print(line)

strip()은 줄 끝의 \n(줄바꿈 문자)을 제거합니다. 없으면 출력할 때 빈 줄이 생깁니다.

CSV 파일 읽기

CSV(Comma-Separated Values)는 실험 데이터의 표준 포맷 중 하나입니다. 장비에서 내보낸 데이터, TCGA 임상 데이터, NCBI에서 다운로드한 데이터 모두 CSV로 제공됩니다.

text
sample_id,gene,expression,status
S001,EGFR,12.5,high
S002,TP53,3.2,low
S003,EGFR,18.7,high
S004,BRCA1,7.1,medium
S005,TP53,2.8,low

Python의 csv 모듈로 읽습니다:

python
import csv
with open("expression_data.csv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
print(f"{row['sample_id']}: {row['gene']} = {row['expression']}")

csv.DictReader는 첫 줄(헤더)을 키로 사용해서, 각 행을 딕셔너리로 변환합니다. row['gene']처럼 컬럼 이름으로 접근할 수 있어서 편리합니다.

조건부 필터링

"EGFR 유전자만 추출하고 싶다" — 반복문과 조건문을 합치면 됩니다:

python
import csv
egfr_samples = []
with open("expression_data.csv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
if row["gene"] == "EGFR":
egfr_samples.append(row)
print(f"EGFR 시료 수: {len(egfr_samples)}")
for sample in egfr_samples:
print(f" {sample['sample_id']}: expression = {sample['expression']}")
assert len(egfr_samples) == 2

이전 토픽에서 배운 for, if, append, f-string이 모두 활용되고 있습니다. 코딩은 이렇게 — 배운 것들이 쌓여서 합쳐집니다.

CSV 파일 쓰기

필터링한 결과를 새 파일로 저장합니다:

python
import csv
high_expression = [
{"sample_id": "S001", "gene": "EGFR", "expression": "12.5"},
{"sample_id": "S003", "gene": "EGFR", "expression": "18.7"},
]
with open("egfr_high.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["sample_id", "gene", "expression"])
writer.writeheader()
writer.writerows(high_expression)
print("egfr_high.csv 저장 완료")

newline=""은 Windows에서 빈 줄이 생기는 문제를 방지합니다. Mac/Linux에서도 습관적으로 넣어두는 것이 좋습니다.

TSV 파일 다루기

TSV(Tab-Separated Values)는 탭(\t)으로 구분된 파일입니다. 생물정보학에서는 CSV보다 TSV를 자주 씁니다 — NCBI GEO 데이터, BED 파일, DEG 결과물 등.

python
import csv
with open("deg_results.tsv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f, delimiter="\t")
for row in reader:
log2fc = float(row["log2FoldChange"])
pvalue = float(row["pvalue"])
if abs(log2fc) > 1.0 and pvalue < 0.05:
print(f"{row['gene']}: log2FC={log2fc:.2f}, p={pvalue:.4f}")

delimiter="\t"만 추가하면 CSV 코드가 그대로 TSV에 적용됩니다.

직접 해보기 (Faded Example)

아래 빈칸을 채워 CSV 파일에서 특정 조건의 시료를 필터링하는 코드를 완성하세요.

빈칸 채우기python
import
with open("samples.csv", "r", encoding="utf-8") as f:
reader = csv.Reader(f)
for row in reader:
od = float(row[""])
if od > 1.0:
print(f"{row['name']}: OD = {od}")

흔한 에러 & 해결법

Q: FileNotFoundError: No such file or directory 에러가 납니다

파일 경로가 잘못되었습니다. Python은 스크립트를 실행한 디렉토리 기준으로 상대 경로를 해석합니다. ls(터미널)로 파일이 현재 디렉토리에 있는지 확인하세요. Google Colab에서는 왼쪽 파일 탭에서 파일을 업로드해야 합니다.

Q: CSV를 읽었는데 숫자가 문자열로 나옵니다

csv.DictReader는 모든 값을 문자열로 읽습니다. 숫자 연산이 필요하면 float(row["column"]) 또는 int(row["column"])으로 변환하세요.

Q: 한글이 깨져서 나옵니다

encoding="utf-8"을 빠뜨렸거나, 파일이 다른 인코딩(예: euc-kr)으로 저장되었습니다. 한국어 엑셀에서 CSV로 저장하면 euc-kr이 되는 경우가 많습니다. 이 경우 encoding="euc-kr"로 바꿔보세요.

Q: with open()에서 with를 안 쓰면 어떻게 되나요?

f = open("file.txt")로 열 수 있지만, 프로그램이 에러로 중단되면 파일이 닫히지 않습니다. with를 쓰면 에러가 나더라도 자동으로 닫아줍니다. 실험 후 장비 전원을 끄는 것과 같습니다 — with가 자동으로 꺼줍니다.