13,024
回編集
| 368行目: | 368行目: | ||
fw.close() | fw.close() | ||
fr.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> | </syntaxhighlight> | ||
<br><br> | <br><br> | ||