ファイル・フォルダ・拡張子|PC・ブラウザ・ファイルの基本

このページはプロモーション(広告)を含みます。

PC・ブラウザ・ファイルの基本(初級・読む20分+演習30分)

この授業のゴール

仕事でどう使うか

分析の再現性は、「どのファイルを、どこから読んだか」を説明できるかで決まります。ファイル名が 最終_本当に最終.csv のような状態では、半年後に自分でも何が最新か分かりません。

路線 この授業の使いどころ
DS(データサイエンティスト) 原本(生データ)と加工後のデータを別フォルダに置き、分析の入力を特定する。原本を上書きすると元に戻せない
ML(機械学習エンジニア) 学習データ・モデル・評価結果をファイル名とフォルダで管理する。実験の版を取り違えると、性能比較が成り立たない
DX(DX推進・AI企画) 共有フォルダの命名規則と保管ルールを決める。ルールがないと、同じ資料の複数版が現場に散らばる
RS(研究者) 実験データ・解析スクリプト・論文原稿の置き場を決める。データの出所を示す根拠になる

この授業のテーマは「拡張子だけで形式を信じない」「原本を残す」の2つです。

前提

前提は 画面とブラウザの役割 の「層の区別」(ブラウザ内の記録とPCのファイルは別)と、クリック・入力・選択・コピー の「見えない文字」です。

この授業のコードは、ブラウザ内の仮のファイル置き場で実行されます。あなたのPCのフォルダを書き換えることはありません。

身近な状況:どれが最新か分からないフォルダ

Dさんのダウンロードフォルダには、次のファイルが並んでいます。

ab_test.csv
ab_test (1).csv
ab_test_最終.csv
ab_test_最終_本当に最終.csv
ab_test.csv.txt

質問に答えてみてください。

  1. どれが原本(配布されたままのデータ)ですか?
  2. どれが加工後ですか? どんな加工をしましたか?
  3. 最後のファイル ab_test.csv.txt は、CSVですか?

答えられないのは、名前と置き場所に意味を持たせていないからです。3つ目は、拡張子が .txt なので、OSはテキストファイルとして扱います。中身はCSVかもしれませんが、名前だけでは判断できません。

この授業では、ファイルを「名前」「形式」「内容」の3つに分けて考え、フォルダの構成と命名で、原本と作業用を区別できるようにします。

直感的な説明:封筒のラベルと引き出し

ファイルを封筒にたとえます。

大事なのは、印(拡張子)を書き換えても、中身の紙は変わらないという点です。印を .xlsx に書き換えたCSVは、Excel形式のファイルにはなりません。

たとえの限界:封筒の印と違い、拡張子は表示設定によって隠されることがあります。隠れていると、report.pdf.exe が report.pdf に見えて、実行ファイルを開いてしまう事故につながります(文字コードと安全なファイル確認)。

正確な定義:パスと拡張子の規則

パス(場所を表す文字列)には2種類あります。

種類 例 意味
絶対パス /home/user/data/raw/ab_test.csv、C:\Users\user\data\ab_test.csv 最上位から全部書いた場所
相対パス data/raw/ab_test.csv 今いるフォルダ(作業フォルダ)からの場所

区切り文字は、macOS・Linuxでは /、Windowsでは \ です(Pythonでは / も使えます)。

拡張子は、ファイル名の最後の . 以降です。ab_test.csv なら csv、ab_test.csv.txt なら txt です。名前が .gitignore のように . で始まる場合は、名前全体で、拡張子なしの隠しファイルとして扱われます。大文字小文字は、OSによって区別したりしなかったりするので、CSV と csv は同じ形式として扱う処理が必要です。

Pythonの pathlib.PurePosixPath は、文字列のパスを部品に分ける道具です。引数は文字列、属性は文字列を返します。

from pathlib import PurePosixPath
p = PurePosixPath("data/raw/ab_test.csv.txt")
print("name  :", p.name)
print("stem  :", p.stem)
print("suffix:", p.suffix)
print("parent:", p.parent)
print(PurePosixPath(".gitignore").suffix == "")

出力は、name : ab_test.csv.txt、stem : ab_test.csv、suffix: .txt、parent: data/raw、True です。stem は拡張子を除いた名前、suffix は最後の拡張子(ドット付き)です。

段階付き例題:原本と作業用を分けるフォルダ構成

問題:教材CSVを読んで分析するために、原本を壊さないフォルダ構成を作る。

ステップ1:役割を分ける(入力の整理)。

フォルダ 役割 触り方
data/raw 配布された原本 読むだけ。編集しない
data/work 作業用コピー 自由に加工してよい
notes ノートやメモ 手順や気づきを書く
output 結果の出力 何度でも作り直せる

ステップ2:作る(処理)。次のコードで、仮の置き場に同じ構成を作り、原本を作業用へコピーします。mkdir(フォルダを作る)、write_text(文字を書き込む)、shutil.copy(ファイルを複製する)を使います。

import tempfile, pathlib, shutil
root = pathlib.Path(tempfile.mkdtemp())
for d in ["data/raw", "data/work", "notes", "output"]:
    (root / d).mkdir(parents=True, exist_ok=True)

raw = root / "data/raw/ab_test.csv"
raw.write_text("user_id,group\n1,A\n2,B\n", encoding="utf-8")
work = root / "data/work/ab_test_work.csv"
shutil.copy(raw, work)

for p in sorted(root.rglob("*")):
    print("dir " if p.is_dir() else "file", p.relative_to(root))
print(raw.exists(), work.exists())

ステップ3:出力を読む。出力は、dir data、dir data/raw、file data/raw/ab_test.csv、dir data/work、file data/work/ab_test_work.csv、dir notes、dir output、最後に True True です。

ステップ4:意味を言葉にする。コピー後も raw は残っています(True)。作業用 work をどう壊しても、原本から作り直せます。原本を残すとは、元のファイルを加工せず、別のファイルに結果を書くことです。

操作して理解する:拡張子を変えても中身は変わらない

CSVファイルの拡張子だけを .xlsx に書き換えると、何が起こるでしょうか。実際のExcel形式(.xlsx)は、内部でZIP圧縮された形式です。ZIPファイルの先頭の4バイトは PK\x03\x04 と決まっています。ファイルの先頭の数バイトを読めば、拡張子ではなく中身の形式を推定できます。

import tempfile, pathlib, zipfile
root = pathlib.Path(tempfile.mkdtemp())
csv = root / "scores.csv"
csv.write_text("id,score\n1,80\n2,90\n", encoding="utf-8")
with zipfile.ZipFile(root / "real.zip", "w") as z:
    z.write(csv, "scores.csv")

fake = csv.rename(root / "scores.xlsx")      # 拡張子だけ変更
for p in (fake, root / "real.zip"):
    print(p.name, p.read_bytes()[:4])
print(zipfile.is_zipfile(fake), zipfile.is_zipfile(root / "real.zip"))

出力は、scores.xlsx b'id,s'、real.zip b'PK\x03\x04'、False True です。read_bytes() はファイルの中身を bytes 型で返し、[:4] は先頭4バイトです。拡張子が .xlsx でも、先頭は CSV の文字 id,s で、ZIPではありません。

試してみる:csv.write_text(...) の中身を別の文字にして、先頭4バイトがどう変わるか確かめましょう。日本語を入れると、1文字が複数バイトになることも見られます(文字コードと安全なファイル確認)。

実際の画面では、ファイルの一覧で「ファイルの種類」や「サイズ」の列を表示し、拡張子と実際の大きさが釣り合うか見る習慣が役に立ちます。数十行のCSVが数十MBだったら、何かがおかしいと疑います。

発展:先頭バイトの目印、複数拡張子、命名規則

先頭バイトの目印(マジックナンバー)は、形式ごとに決まっています。

形式 先頭の目印 備考
PNG画像 \x89PNG 先頭の1バイト目は表示できない値
PDF %PDF テキストとして読める
ZIP PK\x03\x04 .xlsx、.docx、.pptx も内部はZIP
gzip \x1f\x8b .gz
CSV・テキスト 目印なし 中身は文字なので、先頭バイトでは決められない

CSVには決まった目印がありません。そのため、「CSVらしい」かどうかは、複数行を読んで、列数がそろっているかで判断します(文字コードと安全なファイル確認)。

複数の拡張子:archive.tar.gz は「tarでまとめて、gzipで圧縮した」という意味です。pathlib の suffixes は ['.tar', '.gz'] を返し、suffix は最後の .gz だけです。

命名規則の例(変わり得る組織のルールに合わせてください):日付は 2026-10-10 のように年-月-日の順に、版は v01、v02 とゼロ埋めすると、並べ替えが時系列と一致します。v2 と v10 を文字として並べると v10 が先に来ます。空白や記号を避けると、ツール間の受け渡しで事故が減ります。

表示の設定と特殊な文字の扱いは、OSと版によって異なります。執筆時点(2026年)の一般的な説明であり、最新は各OSの公式ヘルプで確認してください。

よくある失敗

失敗1:拡張子を書き換えれば形式が変わると思う

誤った操作:CSVの名前を scores.xlsx に変更して、Excelファイルとして取引先に渡した。

import tempfile, pathlib, zipfile
root = pathlib.Path(tempfile.mkdtemp())
f = root / "scores.csv"
f.write_text("id,score\n1,80\n", encoding="utf-8")
g = f.rename(root / "scores.xlsx")
try:
    zipfile.ZipFile(g)
except zipfile.BadZipFile as e:
    print("開けません:", type(e).__name__)

出力は 開けません: BadZipFile です。本物のExcel形式(ZIPの一種)ではないので、読めません。直し方:形式を変えるには、変換できるアプリで「名前を付けて保存」から形式を選ぶ。変更後に、先頭バイトや、実際にアプリで開いて確かめる。

失敗2:`v2` と `v10` を文字の順に並べて、最新を取り違える

誤った例:版の番号をゼロ埋めせずに付けた。

print(sorted(["report_v2.csv", "report_v10.csv", "report_v1.csv"]))
print(sorted(["report_v02.csv", "report_v10.csv", "report_v01.csv"]))

出力は、1行目が ['report_v1.csv', 'report_v10.csv', 'report_v2.csv']、2行目が ['report_v01.csv', 'report_v02.csv', 'report_v10.csv'] です。ファイル一覧は文字の順に並ぶので、1行目では v10 が v2 の前に来ます。

直し方:版はゼロ埋め(v01)にする。日付を使うなら 2026-10-10 の形にする。「最終」「本当に最終」ではなく、版や日付で区別します。

失敗3:非表示の拡張子に気付かず、名前を信じる

誤った例:ab_test.csv.txt をCSVだと思って、アプリで読もうとした。

from pathlib import PurePosixPath
for name in ["ab_test.csv", "ab_test.csv.txt", "AB_TEST.CSV"]:
    p = PurePosixPath(name)
    print(name, "->", p.suffix, p.suffix.lower() == ".csv")

出力は、ab_test.csv -> .csv True、ab_test.csv.txt -> .txt False、AB_TEST.CSV -> .CSV True です。2行目は最後が .txt で、CSV扱いになりません。3行目は大文字ですが、lower() でそろえるとCSVです。

直し方:OSの設定で拡張子を表示する。ファイル名は最後の拡張子で判断し、大文字小文字をそろえて比べる。さらに、中身の先頭数行を実際に読んで確かめる。

まとめ

用語

拡張子(file extension)

ファイル名の最後の . 以降の部分。OSがアプリを選ぶ目安に使うが、中身の形式は保証しない。

パス(path)

ファイルやフォルダの場所を表す文字列。絶対パスと相対パスがある。

原本(raw data / original file)

配布や取得されたままのデータ。加工せずに残し、再現の出発点にする。

マジックナンバー(magic number)

ファイルの先頭に置かれる、形式を示す決まったバイト列。

バイト(byte)

データ量を数える基本の単位。8ビットにあたる。

よくある質問

なぜ拡張子を信じてはいけないのですか?

拡張子は名前の一部で、誰でも書き換えられるからです。実際の形式は中身で決まります。拡張子が合っていても、中身が別の形式だと、アプリで開けなかったり、悪意のあるファイルを開いてしまったりします。

原本を残すとは、具体的に何をすることですか?

配布されたファイルを加工せず、読み取り専用のように扱うことです。加工は作業用のコピーで行い、結果は別のファイルに書きます。原本があれば、いつでも同じ手順で結果を再現できます。

絶対パスと相対パスは、どう使い分けますか?

相対パスは作業フォルダが変わると指す場所が変わるので、持ち運びのしやすいプロジェクトの内部で使います。絶対パスは確実ですが、PCごとに違うので他の人に渡す資料には向きません。どちらを使ったかを手順に書きます。

日本語や空白を含むファイル名は避けるべきですか?

動作するツールも多いですが、ツールや文字コードによっては文字化けや読み込みの失敗が起きます。共有するデータや自動処理のファイルでは、英数字とアンダースコアを使うと、受け渡しの事故が減ります。

ファイルの形式が分からないとき、どう調べますか?

(1) 拡張子とサイズを見る、(2) 先頭の数バイトを読んで目印を確かめる、(3) テキストなら先頭の数行を読む、の順で調べます。実行ファイルを開いて確かめるのは避けます。

ZIPファイルは開いてよいのですか?

出所が分かる教材のZIPなら、展開して中身を確認できます。展開しても中身をすぐ実行せず、まずファイル名と拡張子の一覧を見ます。出所が不明なファイルは、開く前に確認する習慣をつけます(文字コードと安全なファイル確認)。

確認問題

問1 ab_test.csv.txt の拡張子はどれか。

  1. ① csv
  2. ② txt
  3. ③ csv.txt
  4. ④ ab_test
解答と解説

正解:②

拡張子はファイル名の最後の . 以降です。OSは .txt を見てテキストファイルとして扱います。

問2 CSVファイルの名前を scores.xlsx に変更した。何が起こるか。

  1. ① Excel形式のファイルに変換される
  2. ② ファイルが読み取り専用になる
  3. ③ ファイルが自動的にZIP圧縮される
  4. ④ 名前が変わっただけで、中身は元のCSVのまま
解答と解説

正解:④

名前の変更は中身を変えません。形式を変えるには、変換できるアプリで保存し直す必要があります。

問3 分析の入力にする教材CSVの扱いとして、最も適切なのはどれか。

  1. ① 原本は読むだけにして、作業用にコピーしたものを加工する
  2. ② 原本を直接開いて編集し、上書き保存する
  3. ③ 原本を削除して、加工後だけ残す
  4. ④ 原本の名前に「最終」と付けて保存する
解答と解説

正解:①

原本を残せば、加工を間違えても、いつでもやり直せます。結果の根拠も原本まで辿れます。

問4 report_v2.csv、report_v10.csv、report_v1.csv を文字の順(名前順)に並べたとき、最後に来るのはどれか。

  1. ① report_v1.csv
  2. ② report_v10.csv
  3. ③ report_v2.csv
  4. ④ 並べ方は決まらない
解答と解説

正解:③

文字の順に並べるので、v1、v10、v2 の順になります。最後は v2 です。これが版番号のゼロ埋め(v01)が必要な理由です。

問5 ファイルの先頭4バイトが PK\x03\x04 だった。分かることはどれか。

  1. ① ファイルが壊れている
  2. ② 必ずCSVである
  3. ③ 必ず画像である
  4. ④ ZIP形式(またはその仲間)の可能性が高い
解答と解説

正解:④

PK\x03\x04 はZIPの目印です。.xlsx や .docx も内部はZIPなので、同じ目印になります。

問6 .gitignore のように名前が . で始まるファイルの pathlib の suffix はどうなるか。

  1. ① .gitignore
  2. ② 空文字(拡張子なしの隠しファイル扱い)
  3. ③ .git
  4. ④ エラーになる
解答と解説

正解:②

. で始まる名前は、名前全体が1つの名前として扱われ、拡張子はありません。

次に学ぶこと

次は 保存・ダウンロード・アップロード で、保存・ダウンロード・アップロードの違いを、保存先を軸に整理します。ファイルの中身の読み方は 文字コードと安全なファイル確認 です。

この授業の確認問題だけでモジュールの習得とはしません。ON01 の総合テストと、CSVを使った自力課題で判定します。データの1行が何を表すかは 行と列と1行の単位 で扱います。

キャリア学習:データサイエンティスト・機械学習エンジニア・DX推進・研究者を目指す人の学習アプリ。164モジュール・984授業を、ブラウザで動くSQLとPythonの演習で。基礎と各分野の最初のモジュールは無料。全部は2,980円の買い切り。

アプリを無料で開く有料版と無料版の違い