Pythonでのファイル＆フォルダーのアクセス方法まとめ

Pythonでファイルやフォルダーにアクセスする方法は、スクリプトの実行場所や目的によってさまざまな方法があります。本記事では、Python標準ライブラリの **`os` モジュール** を使って、ファイルパスの取得方法や、カレントディレクトリの操作方法、相対パスを利用したアクセス方法についてメモとして記載しておきます。

さらに、Python 3.4以降で推奨される **`pathlib` モジュール** を使ったファイル操作方法についても記載します。`pathlib` を使うと、より直感的で簡潔なコードを書くことができます。

この記事を参考にすれば、ファイル操作がより柔軟に行えるようになります。

---

## ✅ **Pythonのファイルパス操作で使う主な関数**

| 関数/属性           | 説明                                          |
|--------------------|---------------------------------------------|
| `os.getcwd()`      | 現在の作業ディレクトリ（カレントディレクトリ）を取得 |
| `__file__`         | 実行中のスクリプトファイルのパス               |
| `os.path.abspath()`| 相対パスを絶対パスに変換                      |
| `os.path.dirname()`| パスからディレクトリ部分を取得                 |
| `os.path.join()`   | パスをOS依存の形式で結合                      |
| `os.path.exists()` | ファイルやディレクトリの存在を確認              |
| `os.makedirs()`    | 新しいディレクトリを作成                       |
| `Path`             | `pathlib` モジュールの主要クラス               |
| `Path.cwd()`       | 現在の作業ディレクトリを取得                  |
| `Path(__file__).parent` | スクリプトのディレクトリを取得               |
| `Path.joinpath()`  | パスを結合                                     |
| `Path.exists()`    | ファイルやディレクトリの存在を確認              |
| `Path.resolve()`   | パスを絶対パスに変換し、シンボリックリンクを解決 |

これらの関数を使うことで、柔軟なファイル操作が可能になります。次のセクションで具体的なコード例を紹介します。

---

## 📂 **`os` モジュールを使った基本的なファイルパスの取得方法**

### **1. 現在の作業ディレクトリの取得**
```python
import os

# 現在の作業ディレクトリを取得
current_directory = os.getcwd()
print(f"現在のディレクトリ: {current_directory}")
```
- **`os.getcwd()`** を使うことで、スクリプトが実行されているカレントディレクトリの絶対パスを取得できます。

---

### **2. スクリプトの場所を基準にしたディレクトリの取得**
```python
import os

# スクリプトの場所のパスを取得
current_file_directory = os.path.dirname(os.path.abspath(__file__))
print(f"スクリプトの場所: {current_file_directory}")
```
- **`__file__`** は、実行中のスクリプトファイルのパスを取得します。
- **`os.path.abspath()`** を使うと、相対パスを絶対パスに変換できます。
- **`os.path.dirname()`** でファイルのパスからディレクトリ部分を取得します。

---

## 📂 **`pathlib` モジュールを使ったファイルパスの取得方法**

Python 3.4以降では、`pathlib` モジュールを使うことで、ファイルパス操作がより直感的になります。`os` モジュールを使うよりもシンプルで、クロスプラットフォーム対応のコードが書けます。

### **1. 現在の作業ディレクトリの取得**
```python
from pathlib import Path

# 現在の作業ディレクトリを取得
current_directory = Path.cwd()
print(f"現在のディレクトリ: {current_directory}")
```
- **`Path.cwd()`** は、現在の作業ディレクトリを取得します。

---

### **2. スクリプトの場所を基準にしたディレクトリの取得**
```python
from pathlib import Path

# スクリプトの場所のパスを取得
current_file_directory = Path(__file__).parent
print(f"スクリプトの場所: {current_file_directory}")
```
- **`Path(__file__).parent`** を使うことで、スクリプトファイルが存在するディレクトリのパスを取得できます。

---

### **3. ファイルパスを作成してファイルにアクセス**
```python
from pathlib import Path

# スクリプトの場所からファイルパスを作成
file_path = Path(__file__).parent.joinpath("test.txt")
print(f"ファイルパス: {file_path}")
```
- **`joinpath()`** を使って、ファイルパスを結合します。

---

### **4. 1階層上のディレクトリにあるファイルにアクセス**
```python
from pathlib import Path

# 1階層上の test.txt にアクセス
file_path = Path(__file__).parent.parent.joinpath("test.txt")
print(f"1階層上のファイルパス: {file_path}")
```

---

### **5. 2階層上の特定のディレクトリを指定してファイルにアクセス**
```python
from pathlib import Path

# 2階層上の "data" ディレクトリにある test.txt にアクセス
file_path = Path(__file__).parent.parent.parent.joinpath("data", "test.txt")
print(f"2階層上のファイルパス: {file_path}")
```

---

### **6. ファイルやフォルダーの存在確認**
```python
from pathlib import Path

# ファイルが存在するか確認
file_path = Path(__file__).parent.joinpath("test.txt")
if file_path.exists():
    print("ファイルが見つかりました！")
else:
    print("ファイルが見つかりませんでした。")
```

---

### **7. `Path.resolve()` を使った絶対パスの取得とシンボリックリンクの解決**
```python
from pathlib import Path

# スクリプトの場所のパスを取得し、絶対パスに変換
current_file_directory = Path(__file__).parent.resolve()
print(f"スクリプトの絶対パス: {current_file_directory}")
```
- **`Path.resolve()`** は、パスを絶対パスに変換し、シンボリックリンクが含まれている場合はそのリンクを解決します。
- ファイルやディレクトリの実際の場所を正確に取得したい場合に便利です。

---

## 📂 **`os` モジュールと `pathlib` モジュールの比較**

| 操作内容                  | `os` モジュール                              | `pathlib` モジュール                        |
|-------------------------|---------------------------------------------|------------------------------------------|
| 現在の作業ディレクトリを取得 | `os.getcwd()`                               | `Path.cwd()`                               |
| スクリプトの場所を取得      | `os.path.dirname(os.path.abspath(__file__))` | `Path(__file__).parent`                   |
| ファイルパスを結合          | `os.path.join()`                            | `joinpath()`                               |
| ファイルの存在確認          | `os.path.exists()`                          | `Path.exists()`                            |
| 絶対パスの取得とリンク解決 | `os.path.abspath()`                         | `Path.resolve()`                           |

---

## 🛠 **注意点**

- **`__file__`** は、**スクリプトがファイルとして実行される場合** にのみ有効です。
  - 例えば、**Python REPL** や **Jupyter Notebook** では使用できません。その場合は **`Path.cwd()`** を使いましょう。

この記事を参考に、Pythonでのファイル操作を効率よく行えるようになりましょう！😊