Pythonのファイル書き込み・読み込みの基本まとめ [コピペサンプルコード付き]

すぐ実装できる!初心者向け。Pythonでテキスト・CSVのファイル読み書き処理についてまとめました。

プログラマー以外の方でも手軽にプログラミングを始める時代です。その中でもPythonは人気のプログラム言語の1つでしょう。Pythonは使いやすいと思いますが、やはりビギナーの場合は実際に動く具体的なサンプルが欲しいところです。このような初心者さんの要望を鑑みて「Pythonサンプルコード」シリーズとして記事を公開しています。

本記事ではPythonでファイル(txtファイル、csvファイルなど)に読み込み・書き込みする方法とサンプルコードを整理してまとめています

実行環境はローカルPCのWindows環境で実行しています。

環境

  • Windows 10 Pro
  • Python 3.6.4

 

Pythonのファイル書き込み・読み込みのソースコードの全容。

まず最初にソースコード全体を記載します。詳細な解説は後述します。

最初のパラメータ部分で文字コードとファイル名を指定しています(フルパスで指定することも可能。ファイル名だけの場合はプログラム配置場所と同じ場所となります)。

※ファイル自体の作成、ファイルの途中や先頭への書き込み、など他にも色々と出来ることがありますが初心者向け記事のため省きます。

Pythonソースコード ※ダブルクリックでコピペできます

 

実行結果

 

ファイルの読み込み(ファイルから読み込んだデータをPythonの文字列変数に格納)。

処理本体の関数(read_file_to_str)
file = open(p_filename, ‘r’, encoding=FILE_ENCODING)
file_data = file.read()
file.close()
return file_data
関数の実行
print(‘\n①ファイル読み込み(全体を文字として読み込み)’)
data = read_file_to_str(FILE_NAME_R)
print(data)
実行結果
①ファイル読み込み(全体を文字として読み込み)
testdata1
testdata2
testdata3

単純にファイルを読み込んで、読み込んだ内容を「data」という変数に格納しているプログラムになります。

ファイルの読み込みには「open」を利用します。ファイルを読み込んだ後、「.read()」でファイルの内容を取得できます。「open」時のパラメータは以下です。

  1. 1つ目のパラメータ:読み込むファイル名です
  2. 2つ目のパラメータ:「r」は読み込み専用の意味です
  3. 3つ目のパラメータ:デコード・エンコードする文字コードです

※本サンプルプログラムでは「FILE_NAME_R」「FILE_ENCODING」はプログラムの最初にパラメータ部分で記載しています。

 

ファイルの読み込み(ファイルから読み込んだデータを、改行区切りでPythonのリストに格納)。

処理本体の関数(read_file_to_list)
file = open(p_filename, ‘r’, encoding=FILE_ENCODING)
file_data = [data.strip() for data in file.readlines()]
file.close()
return file_data
関数の実行
print(‘\n②ファイル読み込み(改行区切りでリストにして読み込み’)
data = read_file_to_list(FILE_NAME_R)
print(data)
実行結果
②ファイル読み込み(改行区切りでリストにして読み込み
[‘testdata1’, ‘testdata2’, ‘testdata3’]

ファイルを読み込んで、読み込んだ内容を改行区切りで分割し、「data」というリストに格納しているプログラムになります。基本的には①で記述したソースと同じです。

先ほどは「.read()」を使いましたが、行ごとに読み込む場合は「.readlines()」を使います。しかし、このままだと各リスト要素に「\n」という改行コードが付いてきてしまいます。そのため、「data.strip() for data in file.readlines()」とし、リストの個々の要素の改行コードを取り除いています。

 

ファイルの書き込み(Pythonの文字列変数からファイルに書き込み保存)。

処理本体の関数(write_file_from_str)
file = open(p_filename, p_mode, encoding=FILE_ENCODING)
file.write(p_data)
file.close()
関数の実行
print(‘\n③ファイル書き込み(文字列をそのまま書き込み)’)
write_file_from_str(FILE_NAME_W, ‘w’, ‘data1’)
print(read_file_to_str(FILE_NAME_W))
実行結果
③ファイル書き込み(文字列をそのまま書き込み)
data1

ファイルを書き込む場合も、読み込みと同じく「open」を利用します。

ただし、mode指定(2つ目のパラメータ)には「r」ではなく、「w(上書き保存)」または「a(追記保存)」のどちらかを利用します。サンプルコードは「’w’」を指定し上書きしています。

ファイルの書き込みには「.write(‘書き込む内容’)」を使います。

 

ファイルの書き込み(Pythonのリストから、改行区切りでファイルに書き込み保存(繰り返し処理))。

処理本体の関数(write_file_from_list)
file = open(p_filename, p_mode, encoding=FILE_ENCODING)
for i in range(len(p_data)):
.   file.write(str(p_data[i]) + ‘\n’)
file.close()
関数の実行
print(‘\n④ファイル書き込み(リストを改行区切りで書き込み)’)
write_file_from_list(FILE_NAME_W, ‘w’, [‘data1′,’data2’])
print(read_file_to_str(FILE_NAME_W))
print(‘\n⑤ファイル書き込み(リストを改行区切りで書き込み)’)
write_file_from_list(FILE_NAME_W, ‘a’, [‘data3′,’data4’])
print(read_file_to_str(FILE_NAME_W))
実行結果
④ファイル書き込み(リストを改行区切りで書き込み)
data1
data2
⑤ファイル書き込み(リストを改行区切りで書き込み)
data1
data2
data3
data4

リストをファイルを書き込む場合は「.writelines()」のメソッドがあるのですが、これを使うと改行区切りで保存されず色々と都合が悪いので使いません。

「for」の繰り返し処理で、リストを分解し改行コードを付けながらファイルに書き込んでいきます。サンプルコードでは「w(上書き保存)」で書き込んだ後に、「a(追記保存)」で追加しています。「⑤ファイル書き込み」の実行後はファイル内に4行のデータが入っていることがわかるかと思います。

 

ファイル書き込み(二次元配列のリストをCSVに書き込み)。

処理本体の関数(write_csv_from_list)
file = open(p_filename, p_mode, encoding=FILE_ENCODING)
csv_file = csv.writer(file, lineterminator=’\n’)
for i in range(len(p_data)):
.   csv_file.writerow(p_data[i])
file.close()
関数の実行
print(‘\n⑥ファイル書き込み(2次元リストをCSVに書き込み)’)
write_csv_from_list(CSV_NAME_W, ‘w’, [[‘data5′,’data6′,’data7’],[‘data7′,’data8′,’data9’]])
print(read_file_to_str(CSV_NAME_W))
実行結果
⑥ファイル書き込み(2次元リストをCSVに書き込み)
data5,data6,data7
data7,data8,data9

[[‘data5′,’data6′,’data7’],[‘data7′,’data8′,’data9′]]のような2次元のリストをファイルに書き込みたいケースもあるでしょう。このような場合はCSVファイルとして書き込むと便利です。

基本はリストを書き込む処理と同じですが、CSVの書き込みの場合は「csv.writer(file, lineterminator=’\n’)」を使うと便利です。「lineterminator」は区切りとして改行コードを使うことを指定しています。また、プログラムの先頭に「import csv」を忘れずに付けます。

実際に書き込む際は「.writerow(‘書き込む内容’)」で書き込みを行います(配列のまま書き込むことが出来るので便利)。

 

なお、既に存在するCSVファイルを扱って処理を行う場合や、読み書きを頻繁に行う場合はpandasを使うと便利なのですが、初心者向けではないかと思いますので割愛します。