Pythonで実験データファイルを読み書きする
このトピックを終えたら
PythonでテキストファイルやCSVファイルを読み込み、データをフィルタリングし、結果を新しいファイルに保存できるようになります。
なぜファイル入出力が重要なのか
実験データは最終的にファイルです。機器からCSVでエクスポートし、分析結果をテキストで保存し、他の研究者にファイルで共有します。Excelで開くこともできますが、試料が数千個あると手作業では厳しいです。
Pythonでファイルを扱えば — 1万行のCSVから条件に合う試料だけを抽出する作業がコード5行で終わります。
テキストファイルを読む: open()
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行ずつ処理したい時:
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で提供されます。
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,lowPythonのcsvモジュールで読みます:
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遺伝子だけを抽出したい」— ループと条件文を組み合わせるだけです:
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ファイルを書く
フィルタリングした結果を新しいファイルに保存します:
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結果など。
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ファイルから特定条件のサンプルをフィルタリングするコードを完成させてください。
importwith 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が自動的にやってくれます。