前回のおさらい
前回からosモジュールとshutilモジュールを比較するため、ファイル・フォルダ操作に関して解説をしています。

前回はファイル・フォルダの名前を取得したり、フォルダを新規作成する方法を解説しました。
今回はosモジュールとは違うのですが、ファイル操作に関して解説していきたいと思います。
前回、folder1とfolder2を作成し、現在、下の図の様なフォルダ構造になっていると思います。

再度「os_module_test」にPythonプログラムを作成(もしくは前回のプログラムをそのまま使ってもいいです)します。
そして前回同様、osモジュールをインポートしておきます。
import os
ここまでが準備です。
それではファイル操作に関して解説を進めていきましょう。
ファイルを開く、作成する:open(“ファイル名”, “方法”)
ファイルを作成する基本としては、open()というコマンドを用います。
実はコマンド自体はファイルを開く場合と、ファイルを作成する場合で同じです。
書き方としましては、「open(“ファイル名”, “方法”)」です。
また開いたファイルはパソコンのメモリやらCPUやらを消費するので、使い終わったら閉じる必要があり、ファイルを閉じるには「.close()」を用います。
ということで基本はこんな感じ。
f = open("filename")
#いろいろな処理
f.close()
ファイルを開いて、変数fに代入して、その後いろいろな処理をした後、f.close()で閉じるとなります。
コマンドの中に”方法”というのは、ファイルを開く方法をオプションとして設定することで、開くのか、作成するのか、書き出すのか、はたまた追記するのかを変えることができます。
ファイルを開く方法の基本としては以下の三つの方法を覚えておけば十分かと思います。
ファイルがない場合 | ファイルがある場合 | |
w | 新規作成 | 新規ファイルとして作成 |
a | 新規作成 | 追記 |
r | エラー | 読み取り専用で開く |
大まかにはファイルを書き込むには”w”か”a”、読み込むには”r” を使います。
詳しく説明するため、一つ一つ試していきましょう。
ファイルがない場合の”w”
f = open("document1.txt", "w")
f.close()
print(os.listdir())
実行結果
['Untitled1.ipynb', '.DS_Store', 'Untitled.ipynb', 'folder2', '.ipynb_checkpoints', 'folder1', 'document1.txt']

「document1.txt」が増えているのが分かります。
ファイルがない場合の”a”
f = open("document2.txt", "a")
f.close()
print(os.listdir())
実行結果
['Untitled1.ipynb', '.DS_Store', 'Untitled.ipynb', 'folder2', '.ipynb_checkpoints', 'folder1', 'document2.txt', 'document1.txt']

こちらも新規作成されています。
ファイルがない場合の”r”
f = open("document3.txt", "r")
f.close()
print(os.listdir())
実行結果
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-6-e0bcc2264b80> in <module>
----> 1 f = open("document3.txt", "r")
2 f.close()
3
4 print(os.listdir())
FileNotFoundError: [Errno 2] No such file or directory: 'document3.txt'
ファイルが無いので開ませんでした。
ファイルに書き込む方法:”w”
次にファイルがある場合を試したいのですが、ファイルの中に何か書いておかないと違いが分からないので、ファイルに書き込む方法を先に解説します。
1から5までの数字を一行ずつ書き出してみましょう。
まずは方法を”w”として、ファイルに書き込んでみましょう。
num = [1, 2, 3, 4, 5]
f = open("document1.txt", "w")
for i in num:
f.write(str(i) + "\n")
f.close()
とりあえず1から5の数字をリストにいれて、for文を使って一つ一つ書き込んでみました。
書き込むには「.write(“書き込む文字”)」で書き込めます。
書き込むのは文字(str型)で無いといけないので、str(i)で数字(int型)をstr型に変換しています。
そして”\n”は改行を示す文字列になります。
ちなみにMacで”\”(バックスラッシュ)をタイプするには「Option + ¥」です。
このプログラムを実行するとこんなテキストファイルが出来上がります。

ちなみに”\n”が無いとこうなります。
num = [1, 2, 3, 4, 5]
f = open("document1.txt", "w")
for i in num:
f.write(str(i))
f.close()

先ほどの改行の文字列があるプログラムに戻します。
num = [1, 2, 3, 4, 5]
f = open("document1.txt", "w")
for i in num:
f.write(str(i) + "\n")
f.close()
これをこのまま実行し、「document1.txt」を開き、中身を確認した後、再度このプログラムを実行し、中身を確認してみてください。
毎回ファイルの中身は同じだったかと思います。

これはオプション”w”でファイルを開くと、ファイルがある場合は、前のファイルを削除した後、新規作成するためです。
つまり毎回まっさらなファイルが作成され、書き込みなどの処理が行われるということです。
ファイルに書き込む方法:”a”
次は「document2.txt」に対して、オプション”a”で書き込みをしてみましょう。
num = [1, 2, 3, 4, 5]
f = open("document2.txt", "a")
for i in num:
f.write(str(i) + "\n")
f.close()
まずは1回目の実行をして、ファイルを開いてみます。

先ほどオプション”w”で書き込んだ時と同様、1から5までの数字が一行ずつ書かれています。
それでは再度同じプログラムを実行して、ファイルを開いてみてください。

すると1から5の数字が2回繰り返されています。
つまりオプション”a”で書き込むと、追記されるということです。
ファイルを読み込む方法:”r”
ファイルを書き込む方法が分かったので、今度はファイルを読み込む方法を試してみましょう。
先ほど存在しないファイルを開こうとしたらエラーが出てました。
では存在するファイル、今回は「document1.txt」を開いてみましょう。
読み込む方法はいくつかあるようですが、私がよく使っている一行ずつ読み込む方法を紹介します。
f = open("document1.txt", "r")
for row in f:
print(row)
f.close()
実行結果
1
2
3
4
5
今回はファイルの読み書きを解説しました。
前にCSV、TSVファイルの読み書きをする方法を解説しているのですが、実はこちらの方がより基本の方法になります。
そのためまだCSV、TSVファイルの読み書きの方法をご存知ない方はこちらの記事も併せて読んでいただけるといいかと思います。

次回はフォルダ・ファイルの移動や名前の変更、削除に関して解説をしていきます。

ということで今回はこんな感じで。
コメント