MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Pythonの基礎 - ファイルのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Pythonの基礎 - ファイル
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == Pythonでは、ローカルに保存されたファイルからデータを読み込んだり、ファイルへデータを書き込むことができる。<br> また、ディレクトリに含まれるファイルの一覧を取得したり、ディレクトリ名を変更したりすることもできる。<br> <br><br> == ファイルのオープン / クローズ == ==== ファイルを開く ==== 組み込み関数の<code>open</code>関数を使用してファイルを開くことができる。<br> <syntaxhighlight lang="python"> open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) </syntaxhighlight> <br> 第1引数は、開くファイル名を指定する。<br> 正常に開くことができる場合、対応するファイルオブジェクトを返す。(ファイルオブジェクトは、第2引数で指定したモードにより異なる)<br> 正常に開くことができない場合、例外<code>OSError</code>が送出される。<br> <br> 第2引数は、ファイルを開くモードを指定する。(デフォルトはテキストモード(<code>t</code>)のため、<code>t</code>を明示的に付加する必要はない)<br> バイナリモード(<code>b</code>)で読み込み権限や書き込み権限を付加する場合、<code>r+b</code>や<code>wb</code>と指定する。<br> * r *: 読み込み用(ファイルが存在しない場合はエラー) * r+ *: 読み込みおよび書き込み用(ファイルが存在しない場合はエラー) * w *: 書き込み用(ファイルの中身をクリア) * w+ *: 読み込みおよび書き込み用(ファイルの中身をクリア) * a *: 書き込み用(ファイルの末尾に追加) * a+ *: 読み込みおよび書き込み用(ファイルの末尾に追加) * x *: 書き込み用(ファイルが存在している場合はエラー) * x+ *: 読み込みおよび書き込み用(ファイルが存在している場合はエラー) * b *: バイナリモード * t *: テキストモード <br> 第4引数は、使用する文字エンコーディングを指定する。<br> これは、テキストモードでのみ指定する。<br> * ascii * cp932 * euc_jp * shift_jis * utf-8 (utf_8) <br> エンコーディングを省略した場合は、現在のプラットフォームのデフォルトエンコーディングが使用される。<br> 自身の環境でのデフォルトエンコーディングを確認するには、以下のソースコードを実行する。<br> <syntaxhighlight lang="python"> import locale locale.getpreferredencoding() </syntaxhighlight> <br> もし、UTF-8を使用して記述されたファイルを読み込む場合、<code>encoding='UTF-8'</code>のように引数に指定する。<br> なお、開くファイルが存在しない場合は、例外<code>FileNotFoundError</code>が発生する。<br> <syntaxhighlight lang="python"> f1 = open('myfile.txt', 'r') f2 = open('myfile.txt', 'w+') f3 = open('myfile.txt', 'r', encoding='UTF-8') f4 = open('myfile.txt', 'rb') </syntaxhighlight> <br> 正常にファイルが開かれると、ファイルオブジェクトが返る。<br> ファイルオブジェクトのクラスは、<code>open</code>関数で使用したモードによって異なる。<br> 例えば、テキストモードの場合は<code>io.TextIOWrapper</code>、バイナリモードの読み込みの場合は<code>io.BufferedReader</code>、バイナリモードの書き込みの場合は<code>io.BufferedWriter</code>、<br> バイナリモードの読み書きの場合は<code>io.BufferedRandom</code>となる。<br> * 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 <br> ==== ファイルを閉じる ==== ファイルの使用後は、<code>close</code>関数を使用してファイルオブジェクトを閉じる。<br> <syntaxhighlight lang="python"> f = open('myfile.txt', 'r') # 処理1 # 処理2 f.close() </syntaxhighlight> <br> 他の方法として、<code>with</code>文を使用してファイルを開く場合、使用後は自動的にファイルを閉じることができる。<br> どちらの方法でも、結果は同じになる。<br> <syntaxhighlight lang="python"> with open('myfile.txt', 'r') as f: # 処理1 # 処理2 </syntaxhighlight> <br> 以下の例では、myfile.txtファイルの内容を読み込み画面に出力した後、ファイルオブジェクトを閉じている。<br> 以下の内容のmyfile.txtファイルを作成する。<br> # myfile.txtファイル Hello World <br> <syntaxhighlight lang="python"> f = open('myfile.txt', 'r') data = f.read() print(data) f.close() </syntaxhighlight> <br><br> == デキストファイルファイルの読み込み == ==== 全体を読み込む (readメソッド) ==== ファイルに含まれるテキストを全て読み込む場合、<code>read</code>メソッドを使用する。<br> <syntaxhighlight lang="python"> read(size=-1) </syntaxhighlight> <br> 引数を指定しない場合、ファイルを<code>EOF</code>(ファイルの終端)まで読み込み、文字列として返す。<br> 引数に最大文字数を指定する場合、指定した文字数分だけ読み込む。<br> <br> なお、読み込むファイルの文字エンコードと<code>open</code>関数で指定した文字エンコードが異なる場合、<code>read</code>メソッドを実行した時、例外<code>UnicodeDecodeError</code>が発生する。<br> <br> 以下の例では、プログラムと同階層のディレクトリにmyfile.txtファイル(UTF-8)を作成している。<br> <syntaxhighlight lang="python"> f = open('myfile.txt', 'r', encoding='UTF-8') data = f.read() print(data) f.close() </syntaxhighlight> <br> ==== 行単位で読み込む (readlineメソッド) ==== ファイルから1行ずつファイルの内容を読み込む場合、<code>readline</code>メソッドを使用する。<br> <br> <code>readline</code>メソッドは、改行または<code>EOF</code>までファイルを読み込み、文字列として返す。<br> 引数に最大文字数を指定する場合、指定した文字数分だけ読み込む。<br> ファイルの終端である<code>EOF</code>まで読み込むと空の文字列を返す。<br> <syntaxhighlight lang="python"> readline(size=-1) </syntaxhighlight> <br> 以下の例では、<code>for</code>文および<code>while</code>文を使用して、ファイルの終端まで順にファイルの内容を読み込んでいる。<br> <br> なお、<code>readlines</code>メソッドの場合と同様、各行のデータには改行文字が含まれるため、<br> 必要な場合は、<code>print</code>関数で最後に改行を行わないようにする、または、読み込んだデータの末尾から改行を取り除くこと。<br> <syntaxhighlight lang="python"> # 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() </syntaxhighlight> <br> ==== 行単位で分割してリストとして取得する (readlinesメソッド) ==== <code>readlines</code>メソッドを使用して、ファイル全体の読み込み後、読み込みしたデータを行単位で分割して、リストの要素として追加することができる。<br> <br> <code>readlines</code>メソッドは、引数に最大文字数を指定する場合、指定した文字数分だけ読み込む。<br> <syntaxhighlight lang="python"> readlines(hint=-1) </syntaxhighlight> <br> 以下の例では、ファイルの内容を全て読み込み、行単位で分割してリストとして取得したデータを順に出力している。<br> <br> <code>print</code>関数を使用して出力する場合、各行のデータには改行文字が含まれており、<code>print</code>関数では最後に自動的に改行をするようになっているため、改行が2回出力される。<br> そのため、<code>print</code>関数を使用して出力する場合、改行なしで出力する、または、出力するデータの末尾から改行を取り除くこと。<br> <syntaxhighlight lang="python"> f = open('myfile.txt', 'r') datalist = f.readlines() for data in datalist: print(data, end='') # 改行なしで出力する print(data.rstrip('\n')) # 文字列の末尾から改行を取り除く f.close() </syntaxhighlight> <br><br> == テキストファイルの書き込み == テキストファイルへ書き込むためにファイルを開く場合、 <code>open</code>関数のモードとして<code>w</code>、<code>a</code>、<code>x</code>のいずれかを指定する。<br> <syntaxhighlight lang="python"> f = open('myfile.txt', 'w') f = open('myfile.txt', 'a') f = open('myfile.txt', 'x') </syntaxhighlight> <br> <code>w</code>を指定する場合、対象のファイルが存在していない時はファイルを新規作成して書き込む。<br> ファイルが存在する時はファイルに上書きする。(既存のファイル内容は全て削除)<br> <br> <code>a</code>を指定する場合、対象のファイルが存在していない時はファイルを新規作成して書き込む。<br> ファイルが存在する時は既存のファイル内容に追記して書き込む。<br> <br> <code>x</code>を指定する場合、対象のファイルが存在しない時はファイルを新規作成して書き込む。<br> ファイルが存在する時は、例外<code>FileExistsError</code>が発生する。<br> <br> 書き込むファイルの文字エンコードが、ユーザの環境のデフォルトエンコーディングと異なる場合は、文字エンコードを指定する。<br> <syntaxhighlight lang="python"> f = open('myfile.txt', 'w', encoding='UTF-8') </syntaxhighlight> <br> ==== 書き込み / 上書き (wモード) ==== <code>w</code>モードでファイルを書き込む場合、ファイルが存在しない時はファイルを新規作成、ファイルが存在する時は上書きする。(既存のファイル内容は全て削除)<br> <br> テキストファイルに書き込む場合は、<code>write</code>メソッドを使用する。<br> <code>write</code>メソッドの引数に、ファイルに書き込む文字列を指定する。<br> <br> <code>write</code>メソッドは最後に改行を書き込まないため、必要に応じて<code>\n</code>を合わせて書き込む。<br> 標準では、<code>\n</code>を書き込むと自動的に利用しているプラットフォームに合わせて改行が書き込まれる。<br> 例えば、MacOSの場合は<code>\r</code>、Windowsの場合は<code>\r\n</code>が書き込まれる。<br> <syntaxhighlight lang="python"> f = open('myfile.txt', 'w') f.write('こんにちは\n') f.close() </syntaxhighlight> <br> 複数の文字列をまとめてファイルに書き込む場合は、<code>writelines</code>メソッドを使用する。<br> 引数には、文字列を要素としてリストを指定して、リストの要素を順にファイルに書き込む。<br> <syntaxhighlight lang="python"> f = open('myfile.txt', 'w', encoding='UTF-8') datalist = ['こんにちは\n', 'お元気ですか?\n', 'それではまた\n'] f.writelines(datalist) f.close() </syntaxhighlight> <br> <code>writelines</code>メソッドは自動的に改行を書き込まないため、必要に応じて、要素に格納する文字列に<code>\n</code>を記述する。<br> <code>w</code>モードの場合はファイルが存在しても上書きで書き込むため、<code>open</code>関数で指定した文字エンコードを使用してファイルに書き込む。(既存のファイルの文字エンコードは無視される)<br> そのため、文字エンコードが異なる場合でもエラーにはならない。<br> <br> ==== 追記 (aモード) ==== <code>a</code>モードでファイルを追記する場合、ファイルが存在しない時はファイルを新規作成、ファイルが存在する時はファイルの最後に追記する。(既存の内容はそのまま)<br> <br> ファイルに追記する場合は、<code>w</code>モードと同様、<code>write</code>メソッド、または、<code>writelines</code>メソッドを使用する。<br> <syntaxhighlight lang="python"> f = open('myfile.txt', 'a') f.write('こんにちは\n') datalist = ['お元気ですか?\n', 'それではまた\n'] f.writelines(datalist) f.close() </syntaxhighlight> <br> <u>※注意</u><br> <u>既存のファイルに追記する時、ファイルの文字エンコードとopen関数の文字エンコードが異なる場合、</u><br> <u><code>write</code>メソッドを実行する時はエラーは発生しないが文字化けするため注意すること。</u><br> <br> <syntaxhighlight lang="python"> f = open('myfile.txt', 'a', encoding='UTF-8') f.write('それではまた\n') f.close() </syntaxhighlight> <br> ==== ファイルを新規作成して書き込む (xモード) ==== <code>x</code>モードでファイルに書き込む場合、ファイルが存在しない場合はファイルを新規作成して書き込む。<br> ファイルが存在する場合は、<code>open</code>関数を実行した時点で例外<code>FileExistsError</code>が発生する。<br> <br> ファイルに書き込む場合、<code>w</code>モードと同様、<code>write</code>メソッド、または<code>writelines</code>メソッドを使用する。<br> <syntaxhighlight lang="python"> f = open('myfile.txt', 'x', encoding='UTF-8') f.write('こんにちは\n') datalist = ['お元気ですか?\n', 'それではまた\n'] f.writelines(datalist) f.close() </syntaxhighlight> <br><br> == バイナリファイル == バイナリファイルを読み込む場合、<code>open</code>関数のモードとして<code>rb</code>を指定する。<br> <syntaxhighlight lang="python"> f = open('myfile.dat', 'rb') </syntaxhighlight> <br> バイナリファイルのデータを読み込む場合、<code>read</code>メソッドを使用する。<br> <code>read</code>メソッドの引数には、読み込むバイト数を指定する。<br> 引数を省略した場合は、<code>EOF</code>までのデータを全て読み込み、bytesオブジェクトとして返す。<br> <syntaxhighlight lang="python"> read([size]) </syntaxhighlight> <br> バイナリファイルへ書き込む場合、<code>open</code>関数のモードとして<code>w</code>、<code>a</code>、<code>x</code>のいずれかに<code>b</code>を加えた<code>wb</code>、<code>ab</code>、<code>xb</code>のいずれかを指定する。<br> なお、<code>w</code>、<code>a</code>、<code>x</code>の違いについてはテキストファイルの場合と同様である。<br> <syntaxhighlight lang="python"> f = open('myfile.dat', 'wb') f = open('myfile.dat', 'ab') f = open('myfile.dat', 'xb') </syntaxhighlight> <br> バイナリファイルにデータを書き込む場合、<code>write</code>メソッドを使用して、引数に指定したbytesオブジェクトをバイナリファイルに書き込む。<br> <syntaxhighlight lang="python"> 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' </syntaxhighlight> <br> 以下の例では、画像ファイルを1バイトずつ読み込み、読み込んだデータを新規作成したバイナリファイルに書き込んでいる。<br> ソースコードの実行後、ソースコードと同階層のディレクトリにSample2.pngファイルが生成される。<br> <syntaxhighlight lang="python"> 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() </syntaxhighlight> <br><br> == ファイルの読み書き (pathlib) == Python3.4以降、<code>pathlib</code>モジュールが利用できる。<br> <code>Path</code>クラスのインスタンスを生成した後、用意されたメソッドを使用してファイルの操作を行うことができる。<br> <br> ==== Pathクラスのインスタンスを作成する ==== <code>Path</code>クラスのインスタンスを生成するには、以下のコンストラクタを使用する。<br> <syntaxhighlight lang="python"> class pathlib.Path(*pathsegments) </syntaxhighlight> <br> 引数にファイルのパスを指定して、<code>Path</code>クラスのインスタンスを生成する。<br> <code>Path</code>クラスは、OSに応じて<code>Path</code>クラスのサブクラスである<code>pathlib.WindowsPath</code>クラスまたは<code>pathlib.PosixPath</code>クラスのインスタンスが生成される。<br> <syntaxhighlight lang="python"> import pathlib path = './test/movie' p = pathlib.Path(path) type(p) </syntaxhighlight> <br> なお、<code>pathlib.WindowsPath</code>クラス、および、<code>pathlib.PosixPath</code>クラスのコンストラクタも存在するため、明示的にインスタンスを生成することもできる。<br> ただし、例えば、Windows環境において、<code>pathlib.PosixPath</code>クラスのインスタンスは生成できない。(例外<code>NotImplementedError</code>が発生する)<br> <syntaxhighlight lang="python"> class pathlib.PosixPath(*pathsegments) class pathlib.WindowsPath(*pathsegments) </syntaxhighlight> <br> <syntaxhighlight lang="python"> import pathlib path = './test/movie' wp = pathlib.WindowsPath(path) pp = pathlib.PosixPath(path) </syntaxhighlight> <br> ==== ファイルを開く ==== <code>pathlib</code>モジュールを使用する場合は、<code>Path</code>クラスのインスタンスを生成した後、<code>open</code>メソッドを使用してファイルオブジェクトを取得する。<br> <br> 第1引数には、ファイルを開くモードを指定する。指定できる値は、<code>open</code>関数と同様である。<br> 第3引数には、使用する文字エンコードを指定する。これは、テキストモードでのみ指定する。指定できる値は、<code>open</code>関数と同様である。 <syntaxhighlight lang="python"> Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None) </syntaxhighlight> <br> <syntaxhighlight lang="python"> 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') </syntaxhighlight> <br> <code>Path</code>クラスでは、ファイルオブジェクトを使用せずにファイルの読み書きを行うことができるメソッドが存在するが、一部使用できない機能もある。<br> その場合は、ファイルオブジェクトを取得した上で処理を行うこと。<br> <br> ==== ファイルを閉じる ==== ファイルを使用した後は、<code>close</code>メソッドを使用してファイルオブジェクトを閉じる。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test/name.txt') f = p.open('r') # ...処理 f.close() </syntaxhighlight> <br> 他の方法として、<code>with</code>文を使用することにより、自動的にファイルを閉じることができる。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test/name.txt') with p.open('r') as f: # ...処理1 # ...処理2 </syntaxhighlight> <br> ==== テキストファイルの読み込み ==== テキストファイルの全てを1度に読み込む場合、<code>Path</code>クラスの<code>read_text</code>メソッドを使用する。<br> <br> パスが示すファイルの内容をテキストとして取得する。省略可能な第1引数には、文字エンコードを指定することがきでる。<br> このメソッドは、ファイルオブジェクトを取得する必要がない。<br> <syntaxhighlight lang="python"> Path.read_text(encoding=None, errors=None) </syntaxhighlight> <br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test/name.txt') print(p.read_text()) # 出力 Yamada Andou Kuroki </syntaxhighlight> <br> なお、テキストファイルを行単位で読み込む場合、従来の方法と同様、ファイルオブジェクトに対して<code>readline</code>メソッド等を使用する。 <syntaxhighlight lang="python"> 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 </syntaxhighlight> <br> ==== テキストファイルの書き込み ==== テキストファイルへデータを書き込む場合、<code>Path</code>クラスの<code>write_text</code>メソッドを使用する。<br> <br> 第1引数は、書き込むデータを指定する。(パスが示すファイルへ書き込む)<br> 第2引数には、省略可能であり、文字エンコーディングを指定する。<br> <syntaxhighlight lang="python"> Path.write_text(data, encoding=None, errors=None) </syntaxhighlight> <br> <code>Path</code>クラスの<code>write_text</code>メソッドは、ファイルオブジェクトを取得する必要が無い。<br> なお、ファイルの書き込みは上書きで行われる。<br> また、ファイルが存在しない場合、新規作成した後でテキストの書き込みが行われる。<br> 既存のファイルにファイル内容を追記する場合、従来の方法と同様、ファイルオブジェクトに対して<code>write</code>メソッド等を使用する。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test/name.txt') p.write_text('Suzuki\nHonda\n') print(p.read_text()) p.close() # 出力 Suzuki Honda </syntaxhighlight> <br> 以下の例では、ソースコードの同階層にあるtestディレクトリにあるname.txtファイルの内容を読み込み、<br> 改行文字を区切り文字として、行ごとに要素として追加したリストを作成している。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test/name.txt') data = p.read_text() print(data.split('\n')) p.close() </syntaxhighlight> <br> ==== バイナリファイルの読み書き ==== バイナリファイルに対してデータを読み書きする場合、<code>Path</code>クラスの<code>read_bytes</code>メソッドおよび<code>write_bytes</code>メソッドを使用する。<br> <br> バイナリファイルにデータを読み込む場合、パスが示すファイルの内容をbytesオブジェクトで取得する。<br> <syntaxhighlight lang="python"> Path.read_bytes() </syntaxhighlight> <br> バイナリファイルにデータを書き込む場合、パスが示すファイルに対して、引数で指定したbytesオブジェクトを書き込む。<br> <syntaxhighlight lang="python"> Path.write_bytes(data) </syntaxhighlight> <br> 以下の例では、ソースコードの同階層にあるtestディレクトリにあるname.txtファイルに対して、<br> バイナリデータ(ABCDEFG)を書き込みした後、そのバイナリデータを読み込み標準出力に出力している。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test/name.txt') p.write_bytes(b'ABCDEFG') data = p.read_bytes() print(data) p.close() # 出力 b'ABCDEFG' </syntaxhighlight> <br> また、1度に読み込むデータのバイト数を指定する場合は、従来の方法と同様、ファイルオブジェクトに対して、<code>read</code>メソッド等を使用する。<br> 詳細は、[[Pythonの基礎 - ファイル#バイナリファイル]]を参照すること。<br> <br><br> == ファイルの作成 / 削除 == ==== ファイルの作成 ==== 空のファイルを新規作成する場合は、<code>open</code>関数を使用する。<br> <br> <code>open</code>関数は、ファイルを読み書きするためにファイルを開く関数であるが、<br> <code>w</code>モードでファイルを開く場合、指定したパスが示すファイルが存在しない時はファイルを新規作成する。<br> <syntaxhighlight lang="python"> open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) </syntaxhighlight> <br> <code>open</code>関数の詳細は、[[Pythonの基礎 - ファイル#ファイルのオープン / クローズ]]、および、[[Pythonの基礎 - ファイル#テキストファイルの書き込み]]を参照すること。<br> <br> <syntaxhighlight lang="python"> import os path = './test/uesr.txt' f = open(path, 'w') # f.write('') # 何も書き込まなくてもファイルは新規作成される f.close() </syntaxhighlight> <br> ==== ファイルの削除 ==== ファイルを削除する場合は、<code>os</code>モジュールの<code>remove</code>関数を使用する。<br> <br> <code>remove</code>関数は、第1引数に指定したパスが示すファイルを削除する。<br> <syntaxhighlight lang="python"> os.remove(path, *, dir_fd=None) </syntaxhighlight> <br> 存在しないファイルを削除する場合、例外<code>FileNotFoundError</code>が発生する。<br> <syntaxhighlight lang="python"> import os path = './test/name.txt' os.remove(path) </syntaxhighlight> <br> なお、<code>remove</code>関数はファイルのみ削除することができる。<br> もし、ディレクトリを削除しようとする場合、例外<code>PermissionError</code>が発生する。<br> <br><br> == ファイルの作成 / 削除 (pathlibモジュールの使用) == ==== ファイルの作成 (pathlibモジュールの使用) ==== 空のファイルを新規作成する場合は、pathlibモジュールにある<code>Path</code>クラスの<code>touch</code>メソッドを使用する。<br> <syntaxhighlight lang="python"> Path.touch(mode=0o666, exist_ok=True) </syntaxhighlight> <br> <code>Path</code>クラスの<code>touch</code>メソッドは、パスが示すファイルを新規作成する。<br> 第1引数には、新規作成するファイルの権限を設定する。<u>省略された場合は、8進数で<code>0o666</code>が設定される。</u><br> <br> ファイルを新規作成するには、まず、新規作成するファイルのパスから<code>Path</code>クラスのインスタンスを生成した後、<code>touch</code>メソッドを使用する。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test/uesr.txt') p.touch() </syntaxhighlight> <br> ==== ファイルの削除 (pathlibモジュールの使用) ==== ファイルを削除する場合は、pathlibモジュールにある<code>Path</code>クラスの<code>unlink</code>メソッドを使用する。<br> <syntaxhighlight lang="python"> Path.unlink(missing_ok = False) </syntaxhighlight> <br> 第1引数に<code>True</code>を指定する時、対象のファイルが存在しない場合でもエラーは出力されない。(省略可能)<br> <br> ファイルを削除するには、まず、削除するファイルのパスから<code>Path</code>クラスのインスタンスを生成した後、<code>unlink</code>メソッドを使用する。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test/uesr.txt') p.unlink() </syntaxhighlight> <br><br> == ファイルの存在確認 == 指定したパスが示すファイルが存在するかどうかを確認する場合、<code>os.path</code>モジュールの<code>exists</code>関数を使用する。<br> <br> 引数に指定したパスが存在する場合は、<code>True</code>を返す。<br> また、<code>exists</code>関数は、引数に指定したパスがファイルまたはディレクトリであっても存在する場合は、<code>True</code>を返すことに注意する。<br> <syntaxhighlight lang="python"> os.path.exists(path) </syntaxhighlight> <br> <syntaxhighlight lang="python"> 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 </syntaxhighlight> <br> 引数に指定されたパスにおいて、ファイルまたはディレクトリを判別するには、[[Pythonの基礎 - ファイル#ファイルとディレクトリの判別]]を参照すること。<br> <br><br> == ファイルの存在確認 (pathlibモジュールの使用) == 指定したパスが示すファイルが存在するかどうかを確認する場合、<code>pathlib</code>モジュールにある<code>Path</code>クラスの<code>exists</code>メソッドを使用する。<br> <br> パスが示すファイルやディレクトリが実際に存在するかどうかを返します。<br> また、<code>Path</code>クラスの<code>exists</code>メソッドは、引数に指定したパスがファイルまたはディレクトリであっても存在する場合は、<code>True</code>を返すことに注意する。<br> <syntaxhighlight lang="python"> Path.exists() </syntaxhighlight> <br> ファイルの存在を確認するには、まず、存在を確認するファイルのパスから<code>Path</code>クラスのインスタンスを生成した後、<code>exists</code>メソッドを使用する。<br> <syntaxhighlight lang="python"> 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 + 'は存在しません') </syntaxhighlight> <br><br> == ファイル名の変更 == ファイル名を変更する場合は、<code>os</code>モジュールの<code>rename</code>関数を使用する。<br> <syntaxhighlight lang="python"> os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None) </syntaxhighlight> <br> 第1引数に指定したパスが示すファイル名を、第2引数に指定したパスが示すファイル名に変更する。<br> <br> ファイル名を変更する場合、変更前と変更後でファイルのディレクトリが異なっていても問題ない。<br> ただし、ファイル名を変更する時、変更後のディレクトリが存在しない場合、例外<code>FileNotFoundError</code>が発生する。<br> <syntaxhighlight lang="python"> 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) </syntaxhighlight> <br> Windows環境の場合、変更後のパスが既に存在する場合、例外<code>FileExistsError</code>が発生する。<br> <syntaxhighlight lang="python"> import os oldpath = './test/book.txt' newpath = './back/memo.txt' os.rename(oldpath, newpath) # 既にmemo.txtファイルが存在する場合は、例外FileExistsErrorが発生する </syntaxhighlight> <br><br> == ファイル名の変更 (pathlibモジュールの使用) == ファイル名を変更する場合は、<code>pathlib</code>モジュールにある<code>Path</code>クラスの<code>rename</code>メソッドを使用する。<br> <br> パスが示すファイルの名前を、引数に指定したパスが示すファイル名に変更する。<br> <br> ファイル名を変更する場合、変更前と変更後でファイルのディレクトリが異なっていても問題ない。<br> ただし、ファイル名を変更する時、変更後のディレクトリが存在しない場合、例外<code>FileNotFoundError</code>が発生する。<br> <syntaxhighlight lang="python"> Path.rename(target) </syntaxhighlight> <br> <syntaxhighlight lang="python"> 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')) </syntaxhighlight> <br> Windows環境の場合、変更後のパスが既に存在する場合、例外<code>FileExistsError</code>が発生する。<br> <syntaxhighlight lang="python"> import pathlib oldpath = pathlib.Path('./test/book.txt') oldpath.rename(pathlib.Path('./test/address.txt')) # 既にaddress.txtファイルが存在する場合は、例外FileExistsErrorが発生する </syntaxhighlight> <br><br> == 条件に一致するファイル / ディレクトリの一覧の取得 == ==== 同階層のファイル / ディレクトリの一覧の取得 ==== 指定した条件に一致するファイルの一覧を取得する場合は、<code>glob</code>モジュールの<code>glob</code>関数を使用する。<br> <syntaxhighlight lang="python"> glob.glob(pathname, *, recursive=False) </syntaxhighlight> <br> 第1引数に指定したパスとマッチするファイルおよびディレクトリを、リストとして取得する。<br> この時、パスには以下の特殊文字を指定することができる。<br> * : 0文字以上の任意の文字 ? : 1文字の任意の文字 [abc] : 括弧の中のいずれかの文字 <br> <code>*</code>は、0文字以上の任意の文字とマッチする。<br> 例えば、*.txtと指定する場合、a.txtやmemo.txt等の"0文字以上の任意の文字列" + ".txt"に一致するファイルおよびディレクトリの一覧を取得する。<br> <br> 以下の例では、末尾が.jpgのファイルおよびディレクトリの一覧を取得している。<br> <syntaxhighlight lang="python"> import glob for name in glob.glob('./test/*.txt'): print(name) # 出力 ./test/a.jpg ./test/cup.jpg ./test/pen.jpg </syntaxhighlight> <br> 以下の例では、bから始まるファイルおよびディレクトリの一覧を取得している。<br> <syntaxhighlight lang="python"> import glob for name in glob.glob('./test/b*'): print(name) # 出力 ./test/back.txt ./test/book.png </syntaxhighlight> <br> <code>?</code>は、1文字の任意の文字とマッチする。<br> 例えば、?.txtと指定する場合、a.txtやc.txt等の"1文字の任意の文字" + ".txt"と一致するファイルやディレクトリの一覧を取得する。<br> 2文字以上のabc.txt等にはマッチしない。<br> <br> 以下の例では、3文字の任意の文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している。<br> <syntaxhighlight lang="python"> import glob for name in glob.glob('./test/???.txt'): print(name) # 出力 ./test/cup.txt ./test/pen.txt </syntaxhighlight> <br> <code>[]</code>は、括弧の中に記述した文字のいずれか1文字とマッチする。<br> 例えば、199[789].txtと指定する場合、1997.txt、1998.txt、1999.txtと一致するファイルやディレクトリの一覧を取得する。<br> 1文字ではない19978.txt等にはマッチしない。<br> <br> また、[3-6]や[a-e]等のようにハイフンを記述することにより、文字の範囲を指定することができる。<br> [3-6]は[3456]と等価、[a-e]は[abcde]と等価である。<br> <br> 以下の例では、最初にaからeまでの文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している、<br> さらに、fからzまでの文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している。<br> <syntaxhighlight lang="python"> 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 </syntaxhighlight> <br> <code>glob</code>関数において、特殊文字である<code>*</code>、<code>?</code>、<code>[]</code>をを単なる文字として扱う場合は、<code>[]</code>で囲んで記述する。<br> 例えば、?を文字として扱う場合は、[?]と記述する。<br> <syntaxhighlight lang="python"> import glob for name in glob.glob('./test/*[?]*.txt'): print(name) # 出力 ./test/ab?cd.txt </syntaxhighlight> <br> ==== 再帰的にファイル / ディレクトリの一覧の取得 ==== <code>glob</code>関数において、第2引数に<code>True</code>を指定することにより、特殊文字<code>**</code>が使用できる。<br> <br> パスの指定において、<code>**</code>を使用することにより、全てのファイルおよび0個以上のディレクトリとサブディレクトリにマッチする。<br> <syntaxhighlight lang="python"> glob.glob(pathname *, recursive = False) </syntaxhighlight> <br> 例えば、パスを./**/*.txtと指定する場合、a.txtやmemo.txt等の同階層のディレクトリにあるファイルの他に、<br> ./doc/b.txtや./html/back/2020/report.txt等のサブディレクトリにあるファイルも対象となる。<br> <br> 以下の例では、サブディレクトリを再帰的に検索して条件に一致するファイルを取得している。<br> <syntaxhighlight lang="python"> 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 </syntaxhighlight> <br> ==== 条件に一致するファイルやディレクトリをイテレータとして取得 ==== <code>glob</code>関数は、条件に一致する全てのファイルやディレクトリが含まれるリストが取得できるが、<br> <code>iglob</code>関数は、条件に一致するファイルやディレクトリに順にアクセスできるイテレータを取得することができる。<br> <syntaxhighlight lang="python"> glob.iglob(pathname *, recursive = False) </syntaxhighlight> <br> 多くのファイルやディレクトリが一致するような場合は、全ての結果をまとめて取得するのではなく、逐一取得するイテレータを使用する方が実行速度が早い。<br> <syntaxhighlight lang="python"> 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 </syntaxhighlight> <br><br> == 条件に一致するファイル / ディレクトリの一覧の取得 (pathlibモジュールの使用) == ==== 同階層のファイル / ディレクトリの一覧の取得 (pathlibモジュールの使用) ==== 指定した条件に一致するファイルやディレクトリの一覧を取得する場合、pathlibモジュールにあるPathクラスのglobメソッドを使用する。<br> <syntaxhighlight lang="python"> Path.glob(pattern) </syntaxhighlight> <br> Pathクラスのglobメソッドは、パスが示すディレクトリおよびそのサブディレクトリに含まれるファイルやディレクトリにおいて、<br> 第1引数に指定したパターンとマッチするファイルやディレクトリへ順にアクセスできるイテレータを取得する。<br> この時、パターンには以下の特殊文字を指定することができる。<br> * : 0文字以上の任意の文字 ? : 1文字の任意の文字 [abc] : 括弧の中のいずれかの文字 <br> <code>*</code>は、0文字以上の任意の文字とマッチする。<br> 例えば、*.txtと指定する場合、a.txtやmemo.txt等の"0文字以上の任意の文字列" + ".txt"に一致するファイルおよびディレクトリの一覧を取得する。<br> <br> 以下の例では、末尾が.jpgのファイルおよびディレクトリの一覧を取得している。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test') for name in p.glob('*.txt'): print(name) # 出力 ./test/a.jpg ./test/cup.jpg ./test/pen.jpg </syntaxhighlight> <br> 以下の例では、bから始まるファイルおよびディレクトリの一覧を取得している。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test') for name in p.glob('b*'): print(name) # 出力 ./test/back.txt ./test/book.png </syntaxhighlight> <br> <code>?</code>は、1文字の任意の文字とマッチする。<br> 例えば、?.txtと指定する場合、a.txtやc.txt等の"1文字の任意の文字" + ".txt"と一致するファイルやディレクトリの一覧を取得する。<br> 2文字以上のabc.txt等にはマッチしない。<br> <br> 以下の例では、3文字の任意の文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している。<br> <syntaxhighlight lang="python"> import pathlib p = pathlib.Path('./test') for name in p.glob('???.txt'): print(name) # 出力 ./test/cup.txt ./test/pen.txt </syntaxhighlight> <br> <code>[]</code>は、括弧の中に記述した文字のいずれか1文字とマッチする。<br> 例えば、199[789].txtと指定する場合、1997.txt、1998.txt、1999.txtと一致するファイルやディレクトリの一覧を取得する。<br> 1文字ではない19978.txt等にはマッチしない。<br> <br> また、[3-6]や[a-e]等のようにハイフンを記述することにより、文字の範囲を指定することができる。<br> [3-6]は[3456]と等価、[a-e]は[abcde]と等価である。<br> <br> 以下の例では、最初にaからeまでの文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している、<br> さらに、fからzまでの文字で始まり、末尾が.txtのファイルおよびディレクトリの一覧を取得している。<br> <syntaxhighlight lang="python"> 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 </syntaxhighlight> <br> <code>Path</code>クラスの<code>glob</code>メソッドにおいて、特殊文字である<code>*</code>、<code>?</code>、<code>[]</code>をを単なる文字として扱う場合は、<code>[]</code>で囲んで記述する。<br> 例えば、?を文字として扱う場合は、[?]と記述する。<br> <br> ==== 再帰的にファイル / ディレクトリの一覧の取得 (pathlibモジュールの使用) ==== <code>Path</code>クラスの<code>glob</code>メソッドにおいて、パスの指定時に**を使用することにより、全てのファイルおよび0個以上のディレクトリとサブディレクトリにマッチする。<br> これは、<code>glob</code>モジュールの<code>glob</code>関数とは異なり、<code>Path</code>クラスの<code>glob</code>メソッドはデフォルトでサブディレクトリを再帰的に検索する。<br> <br> 例えば、パスを./**/*.txtと指定する場合、a.txtやmemo.txt等の同階層のディレクトリにあるファイルの他に、<br> ./doc/b.txtや./html/back/2020/report.txt等のサブディレクトリにあるファイルも対象となる。<br> <br> 以下の例では、サブディレクトリを再帰的に検索して条件に一致するファイルを取得している。<br> <syntaxhighlight lang="python"> 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 </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:Python]]
Pythonの基礎 - ファイル
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse