一覧へ

Pythonで実験データファイルを読み書きする

PythonでCSV/TSV実験データを読み書きする方法。バイオ研究者のためのファイル処理入門。

入門
|
60
|
検証済み (2026-06)
CSVファイル入出力実験データTSVパースopen
進捗0/7 (0%)

Pythonで実験データファイルを読み書きする

このトピックを終えたら

PythonでテキストファイルやCSVファイルを読み込み、データをフィルタリングし、結果を新しいファイルに保存できるようになります。


なぜファイル入出力が重要なのか

実験データは最終的にファイルです。機器からCSVでエクスポートし、分析結果をテキストで保存し、他の研究者にファイルで共有します。Excelで開くこともできますが、試料が数千個あると手作業では厳しいです。

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"モードを使いましょう。

1行ずつ読む

ファイルを1行ずつ処理したい時:

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

前のトピックで学んだforifappendf-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)で保存されています。韓国語Excelからcsv保存するとeuc-krになることが多いです。その場合はencoding="euc-kr"に変えてみてください。

Q: with open()withを使わないとどうなりますか?

f = open("file.txt")で開けますが、プログラムがエラーで中断すると、ファイルが閉じられません。withを使えばエラーが発生しても自動的に閉じてくれます。実験後に機器の電源を切るのと同じで — withが自動的にやってくれます。

💬 質問・コメント

0件のコメント

ログインせずに投稿できます。ゲスト投稿は投稿者自身で編集・削除できません。

0/2000

読み込み中...