ファイル・フォルダ・拡張子|PC・ブラウザ・ファイルの基本
このページはプロモーション(広告)を含みます。
PC・ブラウザ・ファイルの基本(初級・読む20分+演習30分)
この授業のゴール
- ファイル名・拡張子・フォルダ・パスを区別し、指定されたファイルの場所を説明できる
- 原本用と作業用のフォルダを分け、原本を上書きしない構成を作れる
- 拡張子を変えても中身の形式は変わらないことを、先頭の数バイトで確かめられる
- 版を区別できるファイル名の付け方を選べる
仕事でどう使うか
分析の再現性は、「どのファイルを、どこから読んだか」を説明できるかで決まります。ファイル名が 最終_本当に最終.csv のような状態では、半年後に自分でも何が最新か分かりません。
| 路線 | この授業の使いどころ |
|---|---|
| DS(データサイエンティスト) | 原本(生データ)と加工後のデータを別フォルダに置き、分析の入力を特定する。原本を上書きすると元に戻せない |
| ML(機械学習エンジニア) | 学習データ・モデル・評価結果をファイル名とフォルダで管理する。実験の版を取り違えると、性能比較が成り立たない |
| DX(DX推進・AI企画) | 共有フォルダの命名規則と保管ルールを決める。ルールがないと、同じ資料の複数版が現場に散らばる |
| RS(研究者) | 実験データ・解析スクリプト・論文原稿の置き場を決める。データの出所を示す根拠になる |
この授業のテーマは「拡張子だけで形式を信じない」「原本を残す」の2つです。
前提
前提は 画面とブラウザの役割 の「層の区別」(ブラウザ内の記録とPCのファイルは別)と、クリック・入力・選択・コピー の「見えない文字」です。
- ファイル:名前をもち、中身(データ)を保存した単位
- フォルダ(ディレクトリ):ファイルや他のフォルダを入れる入れ物
- バイト:コンピューターがデータを数える単位。半角英数字は通常1文字が1バイト
この授業のコードは、ブラウザ内の仮のファイル置き場で実行されます。あなたのPCのフォルダを書き換えることはありません。
身近な状況:どれが最新か分からないフォルダ
Dさんのダウンロードフォルダには、次のファイルが並んでいます。
ab_test.csv
ab_test (1).csv
ab_test_最終.csv
ab_test_最終_本当に最終.csv
ab_test.csv.txt
質問に答えてみてください。
- どれが原本(配布されたままのデータ)ですか?
- どれが加工後ですか? どんな加工をしましたか?
- 最後のファイル
ab_test.csv.txtは、CSVですか?
答えられないのは、名前と置き場所に意味を持たせていないからです。3つ目は、拡張子が .txt なので、OSはテキストファイルとして扱います。中身はCSVかもしれませんが、名前だけでは判断できません。
この授業では、ファイルを「名前」「形式」「内容」の3つに分けて考え、フォルダの構成と命名で、原本と作業用を区別できるようにします。
直感的な説明:封筒のラベルと引き出し
ファイルを封筒にたとえます。
- ファイル名:封筒の表書き。「売上表」と書いてあっても、中身が売上表とは限らない
- 拡張子:表書きの最後に付けた小さな印(
.csvなど)。OSはこの印を見て、どのアプリで開くか決める - 内容:封筒の中の紙。実際の形式は中身で決まる
- フォルダ:封筒をしまう引き出し。引き出しの中にさらに引き出しを作れる
- パス:引き出しの位置を示す住所。
data/raw/ab_test.csvなら「data の中の raw の中の ab_test.csv」
大事なのは、印(拡張子)を書き換えても、中身の紙は変わらないという点です。印を .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 |
テキストとして読める | |
| 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の設定で拡張子を表示する。ファイル名は最後の拡張子で判断し、大文字小文字をそろえて比べる。さらに、中身の先頭数行を実際に読んで確かめる。
まとめ
- ファイルは名前・形式・内容の3つで考える。拡張子は名前の一部で、中身を保証しない。
- 拡張子は最後の
.以降。data.csv.txtは txt。大文字小文字はそろえて比べる。 - 原本は読むだけにして残し、作業用コピーで加工する。結果は別のフォルダに出力する。
- 形式を疑うときは、先頭バイトと先頭数行を確かめる。名前の変更では形式は変わらない。
- 版や日付は、ゼロ埋めと年-月-日で並び順と一致させる。
用語
- 拡張子(file extension)
ファイル名の最後の
.以降の部分。OSがアプリを選ぶ目安に使うが、中身の形式は保証しない。- パス(path)
ファイルやフォルダの場所を表す文字列。絶対パスと相対パスがある。
- 原本(raw data / original file)
配布や取得されたままのデータ。加工せずに残し、再現の出発点にする。
- マジックナンバー(magic number)
ファイルの先頭に置かれる、形式を示す決まったバイト列。
- バイト(byte)
データ量を数える基本の単位。8ビットにあたる。
よくある質問
なぜ拡張子を信じてはいけないのですか?
拡張子は名前の一部で、誰でも書き換えられるからです。実際の形式は中身で決まります。拡張子が合っていても、中身が別の形式だと、アプリで開けなかったり、悪意のあるファイルを開いてしまったりします。
原本を残すとは、具体的に何をすることですか?
配布されたファイルを加工せず、読み取り専用のように扱うことです。加工は作業用のコピーで行い、結果は別のファイルに書きます。原本があれば、いつでも同じ手順で結果を再現できます。
絶対パスと相対パスは、どう使い分けますか?
相対パスは作業フォルダが変わると指す場所が変わるので、持ち運びのしやすいプロジェクトの内部で使います。絶対パスは確実ですが、PCごとに違うので他の人に渡す資料には向きません。どちらを使ったかを手順に書きます。
日本語や空白を含むファイル名は避けるべきですか?
動作するツールも多いですが、ツールや文字コードによっては文字化けや読み込みの失敗が起きます。共有するデータや自動処理のファイルでは、英数字とアンダースコアを使うと、受け渡しの事故が減ります。
ファイルの形式が分からないとき、どう調べますか?
(1) 拡張子とサイズを見る、(2) 先頭の数バイトを読んで目印を確かめる、(3) テキストなら先頭の数行を読む、の順で調べます。実行ファイルを開いて確かめるのは避けます。
ZIPファイルは開いてよいのですか?
出所が分かる教材のZIPなら、展開して中身を確認できます。展開しても中身をすぐ実行せず、まずファイル名と拡張子の一覧を見ます。出所が不明なファイルは、開く前に確認する習慣をつけます(文字コードと安全なファイル確認)。
確認問題
問1 ab_test.csv.txt の拡張子はどれか。
- ① csv
- ② txt
- ③ csv.txt
- ④ ab_test
解答と解説
正解:②
拡張子はファイル名の最後の . 以降です。OSは .txt を見てテキストファイルとして扱います。
問2 CSVファイルの名前を scores.xlsx に変更した。何が起こるか。
- ① Excel形式のファイルに変換される
- ② ファイルが読み取り専用になる
- ③ ファイルが自動的にZIP圧縮される
- ④ 名前が変わっただけで、中身は元のCSVのまま
解答と解説
正解:④
名前の変更は中身を変えません。形式を変えるには、変換できるアプリで保存し直す必要があります。
問3 分析の入力にする教材CSVの扱いとして、最も適切なのはどれか。
- ① 原本は読むだけにして、作業用にコピーしたものを加工する
- ② 原本を直接開いて編集し、上書き保存する
- ③ 原本を削除して、加工後だけ残す
- ④ 原本の名前に「最終」と付けて保存する
解答と解説
正解:①
原本を残せば、加工を間違えても、いつでもやり直せます。結果の根拠も原本まで辿れます。
問4 report_v2.csv、report_v10.csv、report_v1.csv を文字の順(名前順)に並べたとき、最後に来るのはどれか。
- ① report_v1.csv
- ② report_v10.csv
- ③ report_v2.csv
- ④ 並べ方は決まらない
解答と解説
正解:③
文字の順に並べるので、v1、v10、v2 の順になります。最後は v2 です。これが版番号のゼロ埋め(v01)が必要な理由です。
問5 ファイルの先頭4バイトが PK\x03\x04 だった。分かることはどれか。
- ① ファイルが壊れている
- ② 必ずCSVである
- ③ 必ず画像である
- ④ ZIP形式(またはその仲間)の可能性が高い
解答と解説
正解:④
PK\x03\x04 はZIPの目印です。.xlsx や .docx も内部はZIPなので、同じ目印になります。
問6 .gitignore のように名前が . で始まるファイルの pathlib の suffix はどうなるか。
- ①
.gitignore - ② 空文字(拡張子なしの隠しファイル扱い)
- ③
.git - ④ エラーになる
解答と解説
正解:②
. で始まる名前は、名前全体が1つの名前として扱われ、拡張子はありません。
次に学ぶこと
次は 保存・ダウンロード・アップロード で、保存・ダウンロード・アップロードの違いを、保存先を軸に整理します。ファイルの中身の読み方は 文字コードと安全なファイル確認 です。
この授業の確認問題だけでモジュールの習得とはしません。ON01 の総合テストと、CSVを使った自力課題で判定します。データの1行が何を表すかは 行と列と1行の単位 で扱います。
キャリア学習:データサイエンティスト・機械学習エンジニア・DX推進・研究者を目指す人の学習アプリ。164モジュール・984授業を、ブラウザで動くSQLとPythonの演習で。基礎と各分野の最初のモジュールは無料。全部は2,980円の買い切り。
アプリを無料で開く有料版と無料版の違い