プログラム本体の保存場所と同じ階層に「data」という名前のディレクトリ(フォルダ)を作成し,「data.txt」を準備します.ここで注意すべきことは Window 環境ではディレクトリの区切りに「\(バックスラッシュ,日本語環境では円マーク)」,Mac や Linux では「/(スラッシュ)」が使われているということです.ディレクトリとファイル名を指定してファイルを開くときに,OSによってディレクトリの区切り文字が異なるので,その違いを吸収できる書き方を考えよう.
データファイル (data.txt)
1 2 3
Windows 環境ではディレクトリの区切りに「\」が使われる.この「\」自体を文字として扱うためには「\\」のように記述する必要があります.よって,次のようにディレクトリとファイル名を指定すると良いでしょう.
ファイルを開く
f = open('data\\data.txt', 'r')
msg = f.readline()
f.close()
print(msg)
1 2 3
しかしながら,「\」だけや,Mac (Linux) の区切り文字「/」でも正しく動作します.
ファイルを開く
f = open('data\data.txt', 'r')
msg = f.readline()
f.close()
print(msg)
1 2 3
ファイルを開く
f = open('data/data.txt', 'r')
msg = f.readline()
f.close()
print(msg)
1 2 3
Mac や Linux ではディレクトリの区切り文字に「/」が用いられるので,Windows で動作した「\\」や「\」ではエラーになる
ファイルを開く
f = open('data\\data.txt', 'r')
msg = f.readline()
f.close()
print(msg)
FileNotFoundError
ファイルを開く
f = open('data\data.txt', 'r')
msg = f.readline()
f.close()
print(msg)
FileNotFoundError
Mac や Linux では「/」で動作します.
ファイルを開く
f = open('data/data.txt', 'r')
msg = f.readline()
f.close()
print(msg)
1 2 3
Python の標準モジュール os モジュールを使うと OS の違いを吸収できるようになります.まずプログラムの先頭でモジュールを読み込んでおきます.
モジュールを読み込む
import os
現在のディレクトリ(フォルダ)を取得してみよう.これには os.getcwd
(GET Current Working Directory) を利用すると良いでしょう.
現在のディレクトリを取得 (Win)
cwd = os.getcwd()
print(cwd)
C:\Users\lecture\Documents\python
上の例はWindows で実行した場合の結果です.Mac で実行すると次のようになります.
現在のディレクトリを取得 (Mac)
cwd = os.getcwd()
print(cwd)
/Users/rinsaka/Documents/python/
次は OS で使われるディレクトリの区切り文字を取得します.
ディレクトリの区切り文字を取得する (Win)
print(os.path.sep)
\
ディレクトリの区切り文字を取得する (Mac)
print(os.path.sep)
/
指定した文字列の join メソッドを使うと,引数に与えた文字列のリストを指定した文字列を区切り文字として連結できます.したがって,「現在のディレクトリ」「サブディレクトリ名」「ファイル名」からなるリストを引数に渡すことで,OSの違いを吸収したファイルのパスを生成できます.
ファイルパスを生成 (Win)
file_path = os.path.sep.join([cwd, 'data', 'data.txt'])
print(file_path)
C:\Users\lecture\Documents\python\data\data.txt
ファイルパスを生成 (Mac)
file_path = os.path.sep.join([cwd, 'data', 'data.txt'])
print(file_path)
/Users/rinsaka/Documents/python/data/data.txt
上のような方法で記述すれば,Windows でも Mac でも動作します.
上の方法を使って,「data」ディレクトリに保存された「data.txt」を絶対パス指定で開いてみよう.この方法を使えば,Windows でも Mac でも正しくファイルを開くことができます.
絶対パス指定でファイルを開く
import os # モジュールのインポート
cwd = os.getcwd() # 現在のディレクトリ
dir = 'data' # ファイルが保存されたディレクトリ名
file = 'data.txt' # 開きたいファイル名
file_path = os.path.sep.join([cwd, dir, file]) # ファイルまでの絶対パスを生成
f = open(file_path) # ファイルを開く
msg = f.readline() # ファイルを読み込む
f.close() # ファイルを閉じる
print(msg) # ファイルの内容を画面に表示
1 2 3
相対パス指定で開くこともできるはずです.この場合は現在のディレクトリを取得する必要はありません.
相対パス指定でファイルを開く
import os # モジュールのインポート
dir = 'data' # ファイルが保存されたディレクトリ名
file = 'data.txt' # 開きたいファイル名
file_path = os.path.sep.join([dir, file]) # ファイルまでの相対パスを生成
f = open(file_path) # ファイルを開く
msg = f.readline() # ファイルを読み込む
f.close() # ファイルを閉じる
print(msg) # ファイルの内容を画面に表示
1 2 3