Pythonの基礎 - ファイル

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動

概要

Pythonでは、ローカルに保存されたファイルからデータを読み込んだり、ファイルへデータを書き込むことができる。
また、ディレクトリに含まれるファイルの一覧を取得したり、ディレクトリ名を変更したりすることもできる。


ファイルのオープン / クローズ

ファイルを開く

組み込み関数のopen関数を使用してファイルを開くことができる。

 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)


第1引数は、開くファイル名を指定する。
正常に開くことができる場合、対応するファイルオブジェクトを返す。(ファイルオブジェクトは、第2引数で指定したモードにより異なる)
正常に開くことができない場合、例外OSErrorが送出される。

第2引数は、ファイルを開くモードを指定する。(デフォルトはテキストモード(t)のため、tを明示的に付加する必要はない)
バイナリモード(b)で読み込み権限や書き込み権限を付加する場合、r+bwbと指定する。

  • r
    読み込み用(ファイルが存在しない場合はエラー)
  • r+
    読み込みおよび書き込み用(ファイルが存在しない場合はエラー)
  • w
    書き込み用(ファイルの中身をクリア)
  • w+
    読み込みおよび書き込み用(ファイルの中身をクリア)
  • a
    書き込み用(ファイルの末尾に追加)
  • a+
    読み込みおよび書き込み用(ファイルの末尾に追加)
  • x
    書き込み用(ファイルが存在している場合はエラー)
  • x+
    読み込みおよび書き込み用(ファイルが存在している場合はエラー)
  • b
    バイナリモード
  • t
    テキストモード


第4引数は、使用する文字エンコーディングを指定する。
これは、テキストモードでのみ指定する。

  • ascii
  • cp932
  • euc_jp
  • shift_jis
  • utf-8 (utf_8)


エンコーディングを省略した場合は、現在のプラットフォームのデフォルトエンコーディングが使用される。
自身の環境でのデフォルトエンコーディングを確認するには、以下のソースコードを実行する。

 import locale
 
 locale.getpreferredencoding()


もし、UTF-8を使用して記述されたファイルを読み込む場合、encoding='UTF-8'のように引数に指定する。
なお、開くファイルが存在しない場合は、例外FileNotFoundErrorが発生する。

 f1 = open('myfile.txt', 'r')
 f2 = open('myfile.txt', 'w+')
 f3 = open('myfile.txt', 'r', encoding='UTF-8')
 f4 = open('myfile.txt', 'rb')


正常にファイルが開かれると、ファイルオブジェクトが返る。
ファイルオブジェクトのクラスは、open関数で使用したモードによって異なる。
例えば、テキストモードの場合はio.TextIOWrapper、バイナリモードの読み込みの場合はio.BufferedReader、バイナリモードの書き込みの場合はio.BufferedWriter
バイナリモードの読み書きの場合はio.BufferedRandomとなる。

  • r
    io.TextIOWrapper
  • r+
    io.TextIOWrapper
  • rb
    io.BufferedReader
  • r+b
    io.BufferedRandom
  • w
    io.TextIOWrapper
  • w+
    io.TextIOWrapper
  • wb
    io.BufferedWriter
  • w+b
    io.BufferedRandom
  • a
    io.TextIOWrapper
  • a+
    io.TextIOWrapper
  • ab
    io.BufferedWriter
  • a+b
    io.BufferedRandom
  • x
    io.TextIOWrapper
  • x+
    io.TextIOWrapper
  • xb
    io.BufferedWriter
  • x+b
    io.BufferedRandom


ファイルを閉じる

ファイルの使用後は、close関数を使用してファイルオブジェクトを閉じる。

 f = open('myfile.txt', 'r')
 # 処理1
 # 処理2
 f.close()


他の方法として、with文を使用してファイルを開く場合、使用後は自動的にファイルを閉じることができる。
どちらの方法でも、結果は同じになる。

 with open('myfile.txt', 'r') as f:
 # 処理1
 # 処理2


以下の例では、myfile.txtファイルの内容を読み込み画面に出力した後、ファイルオブジェクトを閉じている。
以下の内容のmyfile.txtファイルを作成する。

# myfile.txtファイル

Hello
World


 f = open('myfile.txt', 'r')
 
 data = f.read()
 print(data)
 
 f.close()



デキストファイルファイルの読み込み

全体を読み込む (readメソッド)

ファイルに含まれるテキストを全て読み込む場合、readメソッドを使用する。

 read(size=-1)


引数を指定しない場合、ファイルをEOF(ファイルの終端)まで読み込み、文字列として返す。
引数に最大文字数を指定する場合、指定した文字数分だけ読み込む。

なお、読み込むファイルの文字エンコードとopen関数で指定した文字エンコードが異なる場合、readメソッドを実行した時、例外UnicodeDecodeErrorが発生する。

以下の例では、プログラムと同階層のディレクトリにmyfile.txtファイル(UTF-8)を作成している。

 f = open('myfile.txt', 'r', encoding='UTF-8')
 
 data = f.read()
 print(data)
 
 f.close()


行単位で読み込む (readlineメソッド)

ファイルから1行ずつファイルの内容を読み込む場合、readlineメソッドを使用する。

readlineメソッドは、改行またはEOFまでファイルを読み込み、文字列として返す。
引数に最大文字数を指定する場合、指定した文字数分だけ読み込む。
ファイルの終端であるEOFまで読み込むと空の文字列を返す。

 readline(size=-1)


以下の例では、for文およびwhile文を使用して、ファイルの終端まで順にファイルの内容を読み込んでいる。

なお、readlinesメソッドの場合と同様、各行のデータには改行文字が含まれるため、
必要な場合は、print関数で最後に改行を行わないようにする、または、読み込んだデータの末尾から改行を取り除くこと。

 # for文を使用する場合
 f = open('myfile.txt', 'r', encoding='UTF-8')
 
 for data in f:
    print(data)               # 改行をそのまま出力する場合
    print(data.rstrip('\n'))  # 改行を取り除く場合
 
 f.close()
 
 
 # while文を使用する場合
 f = open('myfile.txt', 'r', encoding='UTF-8')
 
 while True:
    data = f.readline()
    if data == '':
       break
 
    print(data)               # 改行をそのまま出力する場合
    print(data.rstrip('\n'))  # 改行を取り除く場合
 
 f.close()


行単位で分割してリストとして取得する (readlinesメソッド)

readlinesメソッドを使用して、ファイル全体の読み込み後、読み込みしたデータを行単位で分割して、リストの要素として追加することができる。

readlinesメソッドは、引数に最大文字数を指定する場合、指定した文字数分だけ読み込む。

 readlines(hint=-1)


以下の例では、ファイルの内容を全て読み込み、行単位で分割してリストとして取得したデータを順に出力している。

print関数を使用して出力する場合、各行のデータには改行文字が含まれており、print関数では最後に自動的に改行をするようになっているため、改行が2回出力される。
そのため、print関数を使用して出力する場合、改行なしで出力する、または、出力するデータの末尾から改行を取り除くこと。

 f = open('myfile.txt', 'r')
 
 datalist = f.readlines()
 for data in datalist:
    print(data, end='')       # 改行なしで出力する
    print(data.rstrip('\n'))  # 文字列の末尾から改行を取り除く
 
 f.close()



テキストファイルの書き込み

テキストファイルへ書き込むためにファイルを開く場合、 open関数のモードとしてwaxのいずれかを指定する。

 f = open('myfile.txt', 'w')
 f = open('myfile.txt', 'a')
 f = open('myfile.txt', 'x')


wを指定する場合、対象のファイルが存在していない時はファイルを新規作成して書き込む。
ファイルが存在する時はファイルに上書きする。(既存のファイル内容は全て削除)

aを指定する場合、対象のファイルが存在していない時はファイルを新規作成して書き込む。
ファイルが存在する時は既存のファイル内容に追記して書き込む。

xを指定する場合、対象のファイルが存在しない時はファイルを新規作成して書き込む。
ファイルが存在する時は、例外FileExistsErrorが発生する。

書き込むファイルの文字エンコードが、ユーザの環境のデフォルトエンコーディングと異なる場合は、文字エンコードを指定する。

 f = open('myfile.txt', 'w', encoding='UTF-8')


書き込み / 上書き (wモード)

wモードでファイルを書き込む場合、ファイルが存在しない時はファイルを新規作成、ファイルが存在する時は上書きする。(既存のファイル内容は全て削除)

テキストファイルに書き込む場合は、writeメソッドを使用する。
writeメソッドの引数に、ファイルに書き込む文字列を指定する。

writeメソッドは最後に改行を書き込まないため、必要に応じて\nを合わせて書き込む。
標準では、\nを書き込むと自動的に利用しているプラットフォームに合わせて改行が書き込まれる。
例えば、MacOSの場合は\r、Windowsの場合は\r\nが書き込まれる。

 f = open('myfile.txt', 'w')
 
 f.write('こんにちは\n')
 
 f.close()


複数の文字列をまとめてファイルに書き込む場合は、writelinesメソッドを使用する。
引数には、文字列を要素としてリストを指定して、リストの要素を順にファイルに書き込む。

 f = open('myfile.txt', 'w', encoding='UTF-8')
 
 datalist = ['こんにちは\n', 'お元気ですか?\n', 'それではまた\n']
 f.writelines(datalist)
 
 f.close()


writelinesメソッドは自動的に改行を書き込まないため、必要に応じて、要素に格納する文字列に\nを記述する。
wモードの場合はファイルが存在しても上書きで書き込むため、open関数で指定した文字エンコードを使用してファイルに書き込む。(既存のファイルの文字エンコードは無視される)
そのため、文字エンコードが異なる場合でもエラーにはならない。

追記 (aモード)

aモードでファイルを追記する場合、ファイルが存在しない時はファイルを新規作成、ファイルが存在する時はファイルの最後に追記する。(既存の内容はそのまま)

ファイルに追記する場合は、wモードと同様、writeメソッド、または、writelinesメソッドを使用する。

 f = open('myfile.txt', 'a')
 
 f.write('こんにちは\n')
 
 datalist = ['お元気ですか?\n', 'それではまた\n']
 f.writelines(datalist)
 
 f.close()


※注意
既存のファイルに追記する時、ファイルの文字エンコードとopen関数の文字エンコードが異なる場合、
writeメソッドを実行する時はエラーは発生しないが文字化けするため注意すること。

 f = open('myfile.txt', 'a', encoding='UTF-8')
 
 f.write('それではまた\n')
 
 f.close()


ファイルを新規作成して書き込む (xモード)

xモードでファイルに書き込む場合、ファイルが存在しない場合はファイルを新規作成して書き込む。
ファイルが存在する場合は、open関数を実行した時点で例外FileExistsErrorが発生する。

ファイルに書き込む場合、wモードと同様、writeメソッド、またはwritelinesメソッドを使用する。

 f = open('myfile.txt', 'x', encoding='UTF-8')
 
 f.write('こんにちは\n')
 
 datalist = ['お元気ですか?\n', 'それではまた\n']
 f.writelines(datalist)
 
 f.close()



バイナリファイル

バイナリファイルを読み込む場合、open関数のモードとしてrbを指定する。

 f = open('myfile.dat', 'rb')


バイナリファイルのデータを読み込む場合、readメソッドを使用する。
readメソッドの引数には、読み込むバイト数を指定する。
引数を省略した場合は、EOFまでのデータを全て読み込み、bytesオブジェクトとして返す。

 read([size])


バイナリファイルへ書き込む場合、open関数のモードとしてwaxのいずれかにbを加えたwbabxbのいずれかを指定する。
なお、waxの違いについてはテキストファイルの場合と同様である。

 f = open('myfile.dat', 'wb')
 f = open('myfile.dat', 'ab')
 f = open('myfile.dat', 'xb')


バイナリファイルにデータを書き込む場合、writeメソッドを使用して、引数に指定したbytesオブジェクトをバイナリファイルに書き込む。

 f = open('myfile.dat', 'wb')
 f.write(b'ABCDEFG')
 f.close()
 
 f = open('myfile.dat', 'rb')
 data = f.read()
 print(data)
 f.close()
 
 # 出力
 b'ABCDEFG'


以下の例では、画像ファイルを1バイトずつ読み込み、読み込んだデータを新規作成したバイナリファイルに書き込んでいる。
ソースコードの実行後、ソースコードと同階層のディレクトリにSample2.pngファイルが生成される。

 fr = open('Sample1.png', 'rb')
 fw = open('Sample2.png', 'wb')
 
 while True:
    data = fr.read(1)
    if len(data) == 0:
       break
 
    fw.write(data)
 
 fw.close()
 fr.close()



ファイルの読み書き (pathlib)

Python3.4以降、pathlibモジュールが利用できる。
Pathクラスのインスタンスを生成した後、用意されたメソッドを使用してファイルの操作を行うことができる。

Pathクラスのインスタンスを作成する

Pathクラスのインスタンスを生成するには、以下のコンストラクタを使用する。

 class pathlib.Path(*pathsegments)


引数にファイルのパスを指定して、Pathクラスのインスタンスを生成する。
Pathクラスは、OSに応じてPathクラスのサブクラスであるpathlib.WindowsPathクラスまたはpathlib.PosixPathクラスのインスタンスが生成される。

 import pathlib
 
 path = './test/movie'
 p = pathlib.Path(path)
 
 type(p)


なお、pathlib.WindowsPathクラス、および、pathlib.PosixPathクラスのコンストラクタも存在するため、明示的にインスタンスを生成することもできる。
ただし、例えば、Windows環境において、pathlib.PosixPathクラスのインスタンスは生成できない。(例外NotImplementedErrorが発生する)

 class pathlib.PosixPath(*pathsegments)
 class pathlib.WindowsPath(*pathsegments)


 import pathlib
 
 path = './test/movie'
 wp = pathlib.WindowsPath(path)
 pp = pathlib.PosixPath(path)


ファイルを開く

pathlibモジュールを使用する場合は、Pathクラスのインスタンスを生成した後、openメソッドを使用してファイルオブジェクトを取得する。

第1引数には、ファイルを開くモードを指定する。指定できる値は、open関数と同様である。
第3引数には、使用する文字エンコードを指定する。これは、テキストモードでのみ指定する。指定できる値は、open関数と同様である。

 Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)


 import pathlib
 
 p = pathlib.Path('./test/name.txt')
 
 f1 = p.open('r')
 f2 = p.open('w+')
 f3 = p.open('r', encoding='UTF-8')
 f4 = p.open('rb')


Pathクラスでは、ファイルオブジェクトを使用せずにファイルの読み書きを行うことができるメソッドが存在するが、一部使用できない機能もある。
その場合は、ファイルオブジェクトを取得した上で処理を行うこと。

ファイルを閉じる

ファイルを使用した後は、closeメソッドを使用してファイルオブジェクトを閉じる。

 import pathlib
 
 p = pathlib.Path('./test/name.txt')
 f = p.open('r')
 
 # ...処理

 f.close()


他の方法として、with文を使用することにより、自動的にファイルを閉じることができる。

 import pathlib
 
 p = pathlib.Path('./test/name.txt')
 with p.open('r') as f:
    # ...処理1
    # ...処理2


テキストファイルの読み込み

テキストファイルの全てを1度に読み込む場合、Pathクラスのread_textメソッドを使用する。

パスが示すファイルの内容をテキストとして取得する。省略可能な第1引数には、文字エンコードを指定することがきでる。
このメソッドは、ファイルオブジェクトを取得する必要がない。

 Path.read_text(encoding=None, errors=None)


 import pathlib
 
 p = pathlib.Path('./test/name.txt')
 print(p.read_text())
 
 # 出力
 Yamada
 Andou
 Kuroki


なお、テキストファイルを行単位で読み込む場合、従来の方法と同様、ファイルオブジェクトに対してreadlineメソッド等を使用する。

 import pathlib
 
 p = pathlib.Path('./test/name.txt')
 f = p.open('r')
 
 while True:
    data = f.readline()
    if data == '':
       break
 
    print (data.rstrip('\n'))
 
 # 出力
 Yamada
 Andou
 Kuroki


テキストファイルの書き込み

テキストファイルへデータを書き込む場合、Pathクラスのwrite_textメソッドを使用する。

第1引数は、書き込むデータを指定する。(パスが示すファイルへ書き込む)
第2引数には、省略可能であり、文字エンコーディングを指定する。

 Path.write_text(data, encoding=None, errors=None)


Pathクラスのwrite_textメソッドは、ファイルオブジェクトを取得する必要が無い。
なお、ファイルの書き込みは上書きで行われる。
また、ファイルが存在しない場合、新規作成した後でテキストの書き込みが行われる。
既存のファイルにファイル内容を追記する場合、従来の方法と同様、ファイルオブジェクトに対してwriteメソッド等を使用する。

 import pathlib
 
 p = pathlib.Path('./test/name.txt')
 p.write_text('Suzuki\nHonda\n')
 
 print(p.read_text())
 
 p.close()
 
 # 出力
 Suzuki
 Honda


以下の例では、ソースコードの同階層にあるtestディレクトリにあるname.txtファイルの内容を読み込み、
改行文字を区切り文字として、行ごとに要素として追加したリストを作成している。

 import pathlib
 
 p = pathlib.Path('./test/name.txt')
 data = p.read_text()
 
 print(data.split('\n'))
 
 p.close()


バイナリファイルの読み書き

バイナリファイルに対してデータを読み書きする場合、Pathクラスのread_bytesメソッドおよびwrite_bytesメソッドを使用する。

バイナリファイルにデータを読み込む場合、パスが示すファイルの内容をbytesオブジェクトで取得する。

 Path.read_bytes()


バイナリファイルにデータを書き込む場合、パスが示すファイルに対して、引数で指定したbytesオブジェクトを書き込む。

 Path.write_bytes(data)


以下の例では、ソースコードの同階層にあるtestディレクトリにあるname.txtファイルに対して、
バイナリデータ(ABCDEFG)を書き込みした後、そのバイナリデータを読み込み標準出力に出力している。

 import pathlib
 
 p = pathlib.Path('./test/name.txt')
 p.write_bytes(b'ABCDEFG')
 
 data = p.read_bytes()
 print(data)
 
 p.close()
 
 # 出力
 b'ABCDEFG'


また、1度に読み込むデータのバイト数を指定する場合は、従来の方法と同様、ファイルオブジェクトに対して、readメソッド等を使用する。
詳細は、Pythonの基礎 - ファイル#バイナリファイルを参照すること。


ファイルの作成 / 削除

ファイルの作成

空のファイルを新規作成する場合は、open関数を使用する。

open関数は、ファイルを読み書きするためにファイルを開く関数であるが、
wモードでファイルを開く場合、指定したパスが示すファイルが存在しない時はファイルを新規作成する。

 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)


open関数の詳細は、Pythonの基礎 - ファイル#ファイルのオープン / クローズ、および、Pythonの基礎 - ファイル#テキストファイルの書き込みを参照すること。

 import os
 
 path = './test/uesr.txt'
 f = open(path, 'w')
 
 # f.write('')  # 何も書き込まなくてもファイルは新規作成される
 
 f.close()


ファイルの削除

ファイルを削除する場合は、osモジュールのremove関数を使用する。

remove関数は、第1引数に指定したパスが示すファイルを削除する。

 os.remove(path, *, dir_fd=None)


存在しないファイルを削除する場合、例外FileNotFoundErrorが発生する。

 import os
 
 path = './test/name.txt'
 os.remove(path)


なお、remove関数はファイルのみ削除することができる。
もし、ディレクトリを削除しようとする場合、例外PermissionErrorが発生する。


ファイルの作成 / 削除 (pathlibモジュールの使用)

ファイルの作成 (pathlibモジュールの使用)

空のファイルを新規作成する場合は、pathlibモジュールにあるPathクラスのtouchメソッドを使用する。

 Path.touch(mode=0o666, exist_ok=True)


Pathクラスのtouchメソッドは、パスが示すファイルを新規作成する。
第1引数には、新規作成するファイルの権限を設定する。省略された場合は、8進数で0o666が設定される。

ファイルを新規作成するには、まず、新規作成するファイルのパスからPathクラスのインスタンスを生成した後、touchメソッドを使用する。

 import pathlib
 
 p = pathlib.Path('./test/uesr.txt')
 p.touch()


ファイルの削除 (pathlibモジュールの使用)

ファイルを削除する場合は、pathlibモジュールにあるPathクラスのunlinkメソッドを使用する。

 Path.unlink(missing_ok = False)


第1引数にTrueを指定する時、対象のファイルが存在しない場合でもエラーは出力されない。(省略可能)

ファイルを削除するには、まず、削除するファイルのパスからPathクラスのインスタンスを生成した後、unlinkメソッドを使用する。

 import pathlib
 
 p = pathlib.Path('./test/uesr.txt')
 p.unlink()



ファイルの存在確認

指定したパスが示すファイルが存在するかどうかを確認する場合、os.pathモジュールのexists関数を使用する。

引数に指定したパスが存在する場合は、Trueを返す。
また、exists関数は、引数に指定したパスがファイルまたはディレクトリであっても存在する場合は、Trueを返すことに注意する。

 os.path.exists(path)


 import os
 import pathlib
 
 path1 = './test/address.txt'
 if os.path.exists(path1) :
    print(path1 + 'は存在します')
 else :
    print(path1 + 'は存在しません')
 
 path2 = './test/user.txt'
 if os.path.exists(path2) :
    print(path2 + 'は存在します')
 else :
    print(path2 + 'は存在しません')
 
 # 出力
 True


引数に指定されたパスにおいて、ファイルまたはディレクトリを判別するには、Pythonの基礎 - ファイル#ファイルとディレクトリの判別を参照すること。


ファイルの存在確認 (pathlibモジュールの使用)

指定したパスが示すファイルが存在するかどうかを確認する場合、pathlibモジュールにあるPathクラスのexistsメソッドを使用する。

パスが示すファイルやディレクトリが実際に存在するかどうかを返します。
また、Pathクラスのexistsメソッドは、引数に指定したパスがファイルまたはディレクトリであっても存在する場合は、Trueを返すことに注意する。

 Path.exists()


ファイルの存在を確認するには、まず、存在を確認するファイルのパスからPathクラスのインスタンスを生成した後、existsメソッドを使用する。

 import pathlib
 
 path1 = './test/address.txt'
 p1 = pathlib.Path(path1)
 if p1.exists() :
    print(path1 + 'は存在します')
 else :
    print(path1 + 'は存在しません')
 
 path2 = './test/user.txt'
 p2 = pathlib.Path(path2)
 if p2.exists() :
    print(path2 + 'は存在します')
 else :
    print(path2 + 'は存在しません')



ファイル名の変更

ファイル名を変更する場合は、osモジュールのrename関数を使用する。

 os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)


第1引数に指定したパスが示すファイル名を、第2引数に指定したパスが示すファイル名に変更する。

ファイル名を変更する場合、変更前と変更後でファイルのディレクトリが異なっていても問題ない。
ただし、ファイル名を変更する時、変更後のディレクトリが存在しない場合、例外FileNotFoundErrorが発生する。

 import os
 
 oldpath1 = './test/book.txt'
 newpath1 = './test/memo.txt'
 os.rename(oldpath, newpath)
 
 oldpath2 = './test/book.txt'
 newpath2 = './test/back/memo.txt'
 os.rename(oldpath, newpath)


Windows環境の場合、変更後のパスが既に存在する場合、例外FileExistsErrorが発生する。

 import os
 
 oldpath = './test/book.txt'
 newpath = './back/memo.txt'
 os.rename(oldpath, newpath)  # 既にmemo.txtファイルが存在する場合は、例外FileExistsErrorが発生する



ファイル名の変更 (pathlibモジュールの使用)

ファイル名を変更する場合は、pathlibモジュールにあるPathクラスのrenameメソッドを使用する。

パスが示すファイルの名前を、引数に指定したパスが示すファイル名に変更する。

ファイル名を変更する場合、変更前と変更後でファイルのディレクトリが異なっていても問題ない。
ただし、ファイル名を変更する時、変更後のディレクトリが存在しない場合、例外FileNotFoundErrorが発生する。

 Path.rename(target)


 import pathlib
 
 oldpath1 = pathlib.Path('./test/book.txt')
 oldpath1.rename(pathlib.Path('./test/memo.txt'))
 
 oldpath2 = pathlib.Path('./test/book.txt')
 oldpath2.rename(pathlib.Path('./test/back/memo.txt'))


Windows環境の場合、変更後のパスが既に存在する場合、例外FileExistsErrorが発生する。

 import pathlib
 
 oldpath = pathlib.Path('./test/book.txt')
 oldpath.rename(pathlib.Path('./test/address.txt'))  # 既にaddress.txtファイルが存在する場合は、例外FileExistsErrorが発生する



条件に一致するファイル / ディレクトリの一覧の取得

同階層のファイル / ディレクトリの一覧の取得

指定した条件に一致するファイルの一覧を取得する場合は、globモジュールのglob関数を使用する。

 glob.glob(pathname, *, recursive=False)


第1引数に指定したパスとマッチするファイルおよびディレクトリを、リストとして取得する。
この時、パスには以下の特殊文字を指定することができる。

* :     0文字以上の任意の文字
? :     1文字の任意の文字
[abc] : 括弧の中のいずれかの文字


*は、0文字以上の任意の文字とマッチする。
例えば、*.txtと指定する場合、a.txtやmemo.txt等の"0文字以上の任意の文字列" + ".txt"に一致するファイルおよびディレクトリの一覧を取得する。

以下の例では、末尾が.jpgのファイルおよびディレクトリの一覧を取得している。

 import glob
 
 for name in glob.glob('./test/*.txt'):
    print(name)
 
 # 出力
 ./test/a.jpg
 ./test/cup.jpg
 ./test/pen.jpg


以下の例では、bから始まるファイルおよびディレクトリの一覧を取得している。

 import glob
 
 for name in glob.glob('./test/b*'):
    print(name)
 
 # 出力
 ./test/back.txt
 ./test/book.png


?は、1文字の任意の文字とマッチする。
例えば、?.txtと指定する場合、a.txtやc.txt等の"1文字の任意の文字" + ".txt"と一致するファイルやディレクトリの一覧を取得する。
2文字以上のabc.txt等にはマッチしない。

以下の例では、3文字の任意の文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している。

 import glob
 
 for name in glob.glob('./test/???.txt'):
    print(name)
 
 # 出力
 ./test/cup.txt
 ./test/pen.txt


[]は、括弧の中に記述した文字のいずれか1文字とマッチする。
例えば、199[789].txtと指定する場合、1997.txt、1998.txt、1999.txtと一致するファイルやディレクトリの一覧を取得する。
1文字ではない19978.txt等にはマッチしない。

また、[3-6]や[a-e]等のようにハイフンを記述することにより、文字の範囲を指定することができる。
[3-6]は[3456]と等価、[a-e]は[abcde]と等価である。

以下の例では、最初にaからeまでの文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している、
さらに、fからzまでの文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している。

 import glob
 
 for name in glob.glob('./test/[a-e]*.txt'):
    print(name)
 
 for name in glob.glob('./test/[c-z]*.txt'):
    print(name)
 
 # 出力
 ./test/book.txt
 ./test/environment.txt
 ./test/flavor.txt
 ./test/pen.txt


glob関数において、特殊文字である*?[]をを単なる文字として扱う場合は、[]で囲んで記述する。
例えば、?を文字として扱う場合は、[?]と記述する。

 import glob
 
 for name in glob.glob('./test/*[?]*.txt'):
    print(name)
 
 # 出力
 ./test/ab?cd.txt


再帰的にファイル / ディレクトリの一覧の取得

glob関数において、第2引数にTrueを指定することにより、特殊文字**が使用できる。

パスの指定において、**を使用することにより、全てのファイルおよび0個以上のディレクトリとサブディレクトリにマッチする。

 glob.glob(pathname *, recursive = False)


例えば、パスを./**/*.txtと指定する場合、a.txtやmemo.txt等の同階層のディレクトリにあるファイルの他に、
./doc/b.txtや./html/back/2020/report.txt等のサブディレクトリにあるファイルも対象となる。

以下の例では、サブディレクトリを再帰的に検索して条件に一致するファイルを取得している。

 import glob
 
 for name in glob.glob('./test/**/*.txt', recursive = True):
    print(name)
 
 # 出力
 ./test/book.txt
 ./test/cup.txt
 ./test/pen.txt
 ./test/doc/sample.txt
 ./test/back/2020.txt
 ./test/back/old/2017.txt


条件に一致するファイルやディレクトリをイテレータとして取得

glob関数は、条件に一致する全てのファイルやディレクトリが含まれるリストが取得できるが、
iglob関数は、条件に一致するファイルやディレクトリに順にアクセスできるイテレータを取得することができる。

 glob.iglob(pathname *, recursive = False)


多くのファイルやディレクトリが一致するような場合は、全ての結果をまとめて取得するのではなく、逐一取得するイテレータを使用する方が実行速度が早い。

 import glob
 
 for name in glob.iglob('./test/**/*.txt', recursive=True):
    print(name)
 
 # 出力
 ./test\book.txt
 ./test\cup.txt
 ./test\pen.txt
 ./test\back\2019.txt
 ./test\back\2020.txt
 ./test\back\old\2017.txt



条件に一致するファイル / ディレクトリの一覧の取得 (pathlibモジュールの使用)

同階層のファイル / ディレクトリの一覧の取得 (pathlibモジュールの使用)

指定した条件に一致するファイルやディレクトリの一覧を取得する場合、pathlibモジュールにあるPathクラスのglobメソッドを使用する。

 Path.glob(pattern)


Pathクラスのglobメソッドは、パスが示すディレクトリおよびそのサブディレクトリに含まれるファイルやディレクトリにおいて、
第1引数に指定したパターンとマッチするファイルやディレクトリへ順にアクセスできるイテレータを取得する。
この時、パターンには以下の特殊文字を指定することができる。

* :     0文字以上の任意の文字
? :     1文字の任意の文字
[abc] : 括弧の中のいずれかの文字


*は、0文字以上の任意の文字とマッチする。
例えば、*.txtと指定する場合、a.txtやmemo.txt等の"0文字以上の任意の文字列" + ".txt"に一致するファイルおよびディレクトリの一覧を取得する。

以下の例では、末尾が.jpgのファイルおよびディレクトリの一覧を取得している。

 import pathlib
 
 p = pathlib.Path('./test')
 for name in p.glob('*.txt'):
    print(name)
 
 # 出力
 ./test/a.jpg
 ./test/cup.jpg
 ./test/pen.jpg


以下の例では、bから始まるファイルおよびディレクトリの一覧を取得している。

 import pathlib
 
 p = pathlib.Path('./test')
 for name in p.glob('b*'):
    print(name)
 
 # 出力
 ./test/back.txt
 ./test/book.png


?は、1文字の任意の文字とマッチする。
例えば、?.txtと指定する場合、a.txtやc.txt等の"1文字の任意の文字" + ".txt"と一致するファイルやディレクトリの一覧を取得する。
2文字以上のabc.txt等にはマッチしない。

以下の例では、3文字の任意の文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している。

 import pathlib
 
 p = pathlib.Path('./test')
 for name in p.glob('???.txt'):
    print(name)
 
 # 出力
 ./test/cup.txt
 ./test/pen.txt


[]は、括弧の中に記述した文字のいずれか1文字とマッチする。
例えば、199[789].txtと指定する場合、1997.txt、1998.txt、1999.txtと一致するファイルやディレクトリの一覧を取得する。
1文字ではない19978.txt等にはマッチしない。

また、[3-6]や[a-e]等のようにハイフンを記述することにより、文字の範囲を指定することができる。
[3-6]は[3456]と等価、[a-e]は[abcde]と等価である。

以下の例では、最初にaからeまでの文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している、
さらに、fからzまでの文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している。

 import pathlib
 
 p = pathlib.Path('./test')
 for name in p.glob('[a-e]*.txt'):
    print(name)
 
 for name in p.glob('[c-z]*.txt'):
    print(name)
 
 # 出力
 ./test/book.txt
 ./test/environment.txt
 ./test/flavor.txt
 ./test/pen.txt


Pathクラスのglobメソッドにおいて、特殊文字である*?[]をを単なる文字として扱う場合は、[]で囲んで記述する。
例えば、?を文字として扱う場合は、[?]と記述する。

再帰的にファイル / ディレクトリの一覧の取得 (pathlibモジュールの使用)

Pathクラスのglobメソッドにおいて、パスの指定時に**を使用することにより、全てのファイルおよび0個以上のディレクトリとサブディレクトリにマッチする。
これは、globモジュールのglob関数とは異なり、Pathクラスのglobメソッドはデフォルトでサブディレクトリを再帰的に検索する。

例えば、パスを./**/*.txtと指定する場合、a.txtやmemo.txt等の同階層のディレクトリにあるファイルの他に、
./doc/b.txtや./html/back/2020/report.txt等のサブディレクトリにあるファイルも対象となる。

以下の例では、サブディレクトリを再帰的に検索して条件に一致するファイルを取得している。

 import pathlib
 
 p = pathlib.Path('./test')
 for name in p.glob('**/*.txt'):
    print(name)
 
 # 出力
 ./test\book.txt
 ./test\cup.txt
 ./test\pen.txt
 ./test\back\2020.txt
 ./test\back\old\2017.txt