Python♪用途別にまとめたファイルの入出力コード

忘れた頃に必要になるファイルの入出力。EXCELのCSVファイルの読み込み、json形式のファイルなど、初歩的な使い方を独断と偏見で選びました。必要になったときに、この記事を開いてコピペできるように用途別に分類してまとめました。

また、文字コードやBOMなど、注意すべき事項についても説明します。

私自身の備忘録として作った記事なので用途が偏っているかもしれませんが、ご了承ください。必要に応じてサンプルを追加していく予定です。

1.入出力のサンプルコードを読む前に

入出力のサンプルコードを見る前にファイルに関する基本事項を簡単にまとめました。

(1) データファイルの保存先

データファイルを保存する場所は、カレントディレクトリより1層下のサブディレクトリに保存する仕様でサンプルプログラムをコーディングします。

コード01では、入力用のデータファイル「input_data1.txt」が、サブディレクトリ「dir_data」のなかにあります。なお、コード01の3行目のos.getcwd()により、カレントディレクトリを取得しています。

つまり、「path+'\\dir_data\\input_data1.txt'」と指定することで、カレントディレクトリ直下のdir_dataの中のinput_data1.txtを呼び出すことができます。

なお、「\」は特殊な意味を持つ文字であるため、文字列の中で使う場合には「\」の前にエスケープ文字「\」をつけて、「\\」としています。

#コード01a
import os
path_file = os.getcwd() + '\\dir_data\\input_data_01a.txt' 
with open(path_file, 'r') as f:
    s = f.read()
    print(s)

参考記事:
Python♪ディレクトリ、カレントディレクトリ、絶対パス、相対パス
Python♪用語集:エスケープシーケンス、エスケープ文字

(2) 文字コードの指定

特に日本語が文字化けする場合には、文字コードを確認しましょう。openの中で、encoding='utf-8'のように指定することで、入出力の文字コードを指定できます。

指定しない場合に使用される文字コードはOSによっても変わります。WindowsではCP932です。コードの最初で「-- coding: utf-8 --」と指定したとしても、ファイルの入出力とは関係ありませんので混同しないようにしましょう。

ファイルから入力する場合には、そのファイルと同じ文字コードを指定しなければ、エラーが発生したり文字化けしたりします。つまり、入力用のデータファイルの文字コードの種類を知っておく必要があります。

例えば、メモ帳で保存できる文字コードは「ANSI」「UTF-16 LE」「 UTF-16 BE」「UTF-8」「UTF-8(BOM 付き)」の5種類であり、Windows10ではディフォルト設定がUTF-8です。つまり、メモ帳でデフォルトのまま作った入力データはUTF-8で開かなければエラーになります。

その他、データを作成するソフトによって、デフォルトの文字コードが異なりますので気をつけましょう。

#input_data_01.txt ※注意:UTF-8
123
aaa
あいう
#コード01b
import os
path_file = os.getcwd() + '\\dir_data\\input_data_01.txt'
with open(path_file, 'r', encoding = 'utf-8') as f:
    s = f.read()
    print(s)

以下、主な文字コードです。CP932は1982年のShift_JISを拡張、修正したものです。

注意しなければならないのは、Windowsのメモ帳でANSIと表記される文字コードはANSIではなくCP932のことです。また、Windowsの多くのテキストエディタでShift JISと表記される文字コードも下表の③のことではなくCP932のことです。

従って、例えばテキストエディタにおいてShift JISで保存し、Pythonでencoding='shift_jis'を指定してファイルを開こうとするとエラーになることがあります。

なお、下表の②~⑤は、いずれも1982年のShift JISから派生した文字コードなので、指定を間違えても開けてしまうことがあります。すぐには勘違いに気付かず、対応していない文字が入っていたときに、いきなりエラーが発生することになりますので注意してください。

基本的にUTF-8を使い、WindowsでUTF-8が使えない場合はCP932を使うことをお勧めします。③~⑦はできるだけ使わない方がよいと思います。

UTF-8'utf-8'・現在最も主流
・Windows10からメモ帳の保存時のディフォルト
CP932'cp932'・1982年のShift JISから派生した文字コード
・WindowsではPythonのファイル入出力のデフォルト
・Windowsのメモ帳ではANSIと表記される
・Windowsの多くのテキストエディタではShift-JISと表記される
・IANAの登録名は「Windows-31J」
・JavaではMS932
JIS X0208-1997'shift_jis'IANAのShift_JISの定義では、JIS X 0208:1997付属書1を引用
Shift-JIS X0213'euc_jisx0213'JIS X 0208の拡張規格
Shift-JIS-2004'euc_jis_2004'Shift_JIS X0213に10文字追加
EUC-JP'euc_jp'UNIX上で日本語の文字を扱う場合に利用されてきた文字コード
ASCII'ascii'アルファベットや数字、記号など128文字を収録した文字コード

文字コードを確認するにはメモ帳やテキストエディタで確認できます。例えばメモ帳では右下に文字コードの種類が表示されます。ただ、古いバージョンのメモ帳では表示されない場合がありますので、その場合は「サクラエディタ」等のテキストエディタをインストールしてください。

ファイルの入出力で文字コードを指定しない場合、WindowsではCP932が指定されます。しかし、想定外のエラーを防ぐために、できるだけ「encoding=」により文字コードを指定した方がよいと思います。

なお、文字コード「Shift JIS」については、以下の記事を参照してください。
Python♪Windowsの「Shift JIS」の落とし穴

(3) BOM付

BOM付のデータの先頭にはデータ形式などの情報が付加されるため、ファイルの入出力の時にエラーや文字化けの原因になります。

入力時のエラーが消えない場合には、そのファイルをメモ帳やテキストエディタで文字コードを確認してください。「UTF-8 (BOM 付)」という表示がされればBOMが原因かもしれません。

BOM付のUTF-8はトラブルの元ですから、BOM付ではないデータ形式を使用してください。

(4) 「with open() as f」と「f = open()、f.close()」

「with open() as f」と「f = open()、f.close()」のどちらを使うかは好みの問題ですが、「with open() as f」は、ファイルを閉じ忘れることがないので、「with open() as f」の方をお勧めします。

以下、コード01cとコード01dは同じです。

#input_data_01.txt ※注意:UTF-8
123
aaa
あいう
#コード01c
import os
path_file = os.getcwd() + '\\dir_data\\input_data_01.txt'
with open(path_file, 'r', encoding = 'utf-8') as f:
    s = f.read()
    print(s)
#コード01d
import os
path_file = os.getcwd() + '\\dir_data\\input_data_01.txt'
f = open(path_file, 'r', encoding = 'utf-8')
s = f.read()
print(s)
f.close()

(4) テキスト形式とバイナリ形式

テキスト形式は、人間が読むことを前提とした形式です。そして、テキスト形式はテキストエディタ、メモ帳などで開くとデータの内容を読むことができます。例えば、プログラムのコードやCSV形式で保存されたファイルはテキスト形式です。

しかし、テキスト形式をそのままコンピューターが理解するのは効率が悪いので、コンピューターがテキストデータを扱うときには機械が読みやすい形式に翻訳されます。

一方、バイナリ形式は人が読まないことを前提とした形式であり、最初から機械が読みやすい形式になっています。

例えば、Excelのファイルはバイナリ形式です。テキストエディタで開いても文字化けします。グラフを埋め込んだ位置やプロパティーを含む複雑なExcelのデータを人間が読める形式で保存するメリットはありません。

バイナリ形式で保存することで、高速化できたり、ファイルのサイズを小さくできたりします。また、ファイルの最後のデータにいきなりアクセスしたり、プログラムのオブジェクトをそのまま保存するといった機能を付加することも可能となります。

2.基本的なファイルへの出力方法

基本的な出力方法としてwriteを使った方法と、print文でファイルオブジェクトを指定する方法を紹介します。

(1) writeを使う方法

writeを使ったノーマルな出力方法です。5行目で'計算結果\n'の'\n'がなければ6行目の出力は改行せずに追加されます。

なお、8行目のように「,」で区切って複数のデータを出力することはできません。

#コード02a
import os
path_file = os.getcwd() + '\\dir_data\\output_data_02a.txt'
with open(path_file, 'w', encoding = 'utf-8') as f:
  f.write('計算結果\n')
  f.write('鉛直変位:{:10.6f}mm\n'.format(3.25))
  f.write('this ')
  #f.write('year:', 2020)   #エラー
  f.write('year: 2020\n')
#output_data_02a.txt
計算結果
鉛直変位:  3.250000mm
this year: 2020

(2) print文でファイルオブジェクトを指定

print( ,file = f)のように、print文の最後でファイルオブジェクトを指定すれば、普通のprint文を使うのと同じような感覚で出力できます。また、7行目のように「end = ''」とすれば改行なしにもできるので、writeよりも使いやすいのではないでしょうか。

コード02bはコード02aと同じ出力になります。

#コード02b
import os
path_file = os.getcwd() + '\\dir_data\\output_data_02b.txt'
with open(path_file, 'w', encoding = 'utf-8') as f:
    print('計算結果', file = f)
    print('鉛直変位:{:10.6f}mm'.format(3.25), file = f)
    print('this ', end = '', file = f)
    print('year:', 2020, file = f)
#output_data_02b.txt
計算結果
鉛直変位:  3.250000mm
this year: 2020

3.一度にすべての内容を入力

ファイルの最初から最後まで一度に全て入力するにはread()を使います。

#input_data_03a.txt ※注意:UTF-8
123
aaa
あいう
#コード03a
import os
path_file = os.getcwd() + '\\dir_data\\input_data_03a.txt'
with open(path_file, 'r', encoding = 'utf-8') as f:
    s = f.read()
    print(s)
#出力03a
123
aaa
あいう

4.行ごとに入力(例:FEM解析の入力データ)

ファイルを一度に入力するread()に対してreadline()はファイルを1行ずつ読み込みます。

しくみは簡単ですが、実際にどのように使うのかイメージがつかめないと思いますので、1行ずつ読み込む例として、解析プログラムの入力データ読み込みを紹介します。なお、入力データはテキストエディタなどで作成します。

では、実際に以下のような入力データを読み込むサンプルプログラムを紹介します。

・節点数:3
・それぞれの節点座標
  節点1:(0, 0)
  節点2:(50, 50)
  節点3:(100, 0)

以下、ファイル名「input_data_04a.txt」の入力データの内容です。

1行目の「節点数」、3行目の「節点座標」は、解析には不要ですが入力データを読みやすくするために記述しました。

なお、コード04aでは文字コードとしてUTF-8を指定していますので、入力ファイルはUTF-8にしてください

節点数
3
節点座標
0.  0.
50. 50
100. 0.

基本的に、以下の1.~4.の繰り返しで入力します。

  1. readlineで1行ずつ読み込む。
  2. stripで文字列の前後の空白、改行を削除。
  3. splitにより空白、タブ、改行の位置で区切り、list化する。
  4. 必要に応じて型変換を行い、変数に代入。
#コード04a
import numpy as np
import os
path_file = os.getcwd() + '\\dir_data\\input_data_04a.txt'
with open(path_file, 'r', encoding='utf-8') as f:
    s_tmp = f.readline()  #この読み込みデータは使わない
    
    #節点数nodの入力
    s_tmp = f.readline()
    s_tmp = s_tmp.strip()  #文字列の最初と最後の空白、改行を削除
    s_tmp = s_tmp.split()  #空白、タブ、改行の位置で文字列を区切り、リストを作成
    nod = int(s_tmp[0])

    s_tmp = f.readline()  #この読み込みデータは使わない

    #節点座標xx[,]の入力
    xx = np.zeros((nod, 2), dtype = 'float64')
    for i in range(nod):
        s_tmp = f.readline()
        s_tmp = s_tmp.strip()
        s_tmp = s_tmp.split()
        xx[i, 0] = np.float64(s_tmp[0])
        xx[i, 1] = np.float64(s_tmp[1])

print('節点数:', nod)
print('節点座標一覧')
for i in range(nod):
    print('No.{}:({:6.2f}, {:6.2f})'.format(i, xx[i, 0], xx[i, 1]))
#出力04a
節点数: 3
節点座標一覧
No.0:(  0.00,   0.00)
No.1:( 50.00,  50.00)
No.2:(100.00,   0.00)

5.Excelより読み込み(空白セルも読み込む)

Excelは便利なので、ExcelでCSVファイルを作成し、PythonからCSVファイルを入力するサンプルコードを紹介します。

Excelファイルで入力したデータを保存するときに指定できるCSVファイルは「CSV UTF-8 (コンマ区切り) (*.csv)」と「CSV (コンマ区切り) (*.csv)」の2種類ですが、「CSV UTF-8 (コンマ区切り) (*.csv)」を選んではいけません。ただの「CSV (コンマ区切り) (*.csv)」を選びましょう

「CSV UTF-8 (コンマ区切り) (*.csv)」はBOM付です。BOM付のデータはファイルの入出力時にエラーや文字化けの原因になります。

なお、「CSV (コンマ区切り) (*.csv)」の文字コードはCP932です。

では、実際に試してみましょう。Excelファイルで以下のように入力し、「CSV (コンマ区切り) (*.csv)」で保存してください。

列A列B列C
行12ケーキ
行245

これをメモ帳で開くと、以下の様に「,」で区切られています。

#Book_05.csv 「CSV  (コンマ区切り) (*.csv)」
,2,ケーキ
4,,5

コード05aは、このCSV形式のファイルから入力しlistに読み込むプログラムです。出力05aのように、Excelの空白セルについても要素が「''」と出力されます。

なお、9行目を10行目のように書き換えると1次元ではなく2次元のリストとして読み込まれます。

#コード05a
import os
path_file = os.getcwd() + '\\dir_data\\Book_05.csv'
s=[]
with open(path_file, 'r') as f:
    for line in f:
        tmp = line.strip()  #文字列前後の空白と改行を削除
        tmp = tmp.split(',')  #「,」の位置で文字列を区切り、リストを作成
        s.extend(tmp)  #sは1次元リスト
        #s.append(tmp)  #sは2次元リスト
print(s)
#出力05a
['', '2', 'ケーキ', '4', '', '5']

コード05bはpythonの標準ライブラリである「csvライブラリ」を使ったサンプルコードです。コード05aと同じことができます。9~12行目を13行目の内容に書き換えると2次元配列として読み込めます。

#コード05b
import csv
import os
path_file = os.getcwd() + '\\dir_data\\Book_05.csv'
s = []
with open(path_file, 'r') as f:
    tmp = csv.reader(f)
    #1次元配列として入力
    for tmp_row in tmp:
        #tmp_rowはlist
        for i in range(len(tmp_row)):
            s.append(tmp_row[i])
    #s = list(tmp) #2次元配列として入力
print(s)
#出力05b
['', '2', 'ケーキ', '4', '', '5']

6.Excelより読み込み(空白セルは削除してつめる)

Excelでデータを入力し、Excelの空白セルは削除してつめる場合は、Excelでデータを「テキスト(タブ区切り)(*.txt)」で保存し、コード06aを使います。

では、実際に試してみましょう。Excelファイルで以下のように入力し、テキスト(タブ区切り)(*.txt)」で保存します。今度は出力06aのように空白セルは無視されます。

列A列B列C
行12ケーキ
行245
#Book_06a.txt 「テキスト(タブ区切り)(*.txt)」
	2	ケーキ
4		5
#コード06a
import os
path_file = os.getcwd() + '\\dir_data\\Book_06a.txt'
with open(path_file, 'r') as f:
    s = f.read()
    #空白、タブ、改行の位置で文字列を区切り、リストを作成
    s = s.split() 
print(s)
#出力06a
['2', 'ケーキ', '4', '5']

Excelから「CSV (コンマ区切り) (*.csv)」形式で保存し、csvのライブラリを使う方法もあります。

#Book_06b.csv 「CSV  (コンマ区切り) (*.csv)」
,2,ケーキ
4,,5
#コード06b
import csv
import os
path_file = os.getcwd() + '\\dir_data\\Book_06b.csv'
s = []
with open(path_file) as f:
    tmp = csv.reader(f)
    for tmp_row in tmp:
        #tmp_rowはlist
        for i in range(len(tmp_row)):
            tmp_row[i] = tmp_row[i].strip()
            if tmp_row[i] != '':
                s.append(tmp_row[i])
print(s)
#出力06b
['2', 'ケーキ', '4', '5']

7.listや辞書をテキスト形式で入出力(JSON)

あるプログラムで計算したlistや辞書等をjson形式に変換してファイルに保存し、別のプログラムで読み込むような場合に使います。

JSON形式なので、特別な操作をしなくても出力したlistや辞書といったデータ型を、そのままのデータ型で入出力できるので便利です。

ただ、NumPy配列は(工夫しなければ)JSON形式に変換できないので注意してください。

(1) list等を1つだけ扱う場合

コード07aは、listや辞書を1つだけ扱う場合のコードです。

#コード07a
import json
import os

s_list = [1, 2, 3]

path_file = os.getcwd() + '\\dir_data\\data_json_07a.txt'
#書き込み用ファイルpath_fileをファイルオブジェクトfとして開く
with open(path_file, 'w') as f:
    #オブジェクトx_listを、json形式にシリアライズし、
    #ファイルオブジェクトfをテキストファイルpath_fileに出力
    json.dump(s_list , f)

path_file = os.getcwd() + '\\dir_data\\data_json_07a.txt'
#json形式のテキストファイルpath_fileをファイルオブジェクトfとして読み込む
with open(path_file, 'r') as f:
    #ファイルオブジェクトfとして読み込んだjson形式の
    #テキストファイルpath_fileをデシリアライズし、x_listに代入
    s_list = json.load(f)

print(s_list)
#出力07a
[1, 2, 3]

(2) 複数のlistや辞書を扱う場合

複数のlistや辞書を入出力したい場合は、コード07bのように、それらのデータを1つのリストにまとめます。

#コード07b
import json
import os
s_list = []
s_list.append([1, 2, 3])
s_list.append({'a': 4, 'b': 5})

path_file = os.getcwd() + '\\dir_data\\data_json_07b.txt'
#書き込み用ファイルpath_fileをファイルオブジェクトfとして開く
with open(path_file, 'w') as f:
    #オブジェクトx_listを、json形式にシリアライズし、
    #ファイルオブジェクトfをテキストファイルpath_fileに出力
    json.dump(s_list , f)

path_file = os.getcwd() + '\\dir_data\\data_json_07b.txt'
#json形式のテキストファイルpath_fileをファイルオブジェクトfとして読み込む
with open(path_file , 'r') as f:
    #ファイルオブジェクトfとして読み込んだjson形式の
    #テキストファイルpath_fileをデシリアライズし、x_listに代入
    s_list1, s_list2 = json.load(f)

print('s_list1', s_list1)
print('s_list2', s_list2)
#出力07b
s_list1 [1, 2, 3]
s_list2 {'a': 4, 'b': 5}

8.NumPy配列の入出力(バイナリ)

NumPy配列をバイナリ形式で入出力する方法を紹介します。NumPy配列の内容をそのまま保存できるので便利です。

(1) NumPy配列を1つだけ扱う場合

コード08aはNumPy配列を1つだけ扱う場合のコードです。ファイルの拡張子はnpyであり、出力時には拡張子を指定する必要がありません。

#コード08a
import numpy as np
import os

s_in1 = np.array([0, 1, 2, 3, 4])

path_file = os.getcwd() + '\\dir_data\\data_np_08a' #拡張子不要
np.save(path_file, s_in1)

path_file = os.getcwd() + '\\dir_data\\data_np_08a.npy' #拡張子必要
s_out = np.load(path_file)

print(s_out)
#出力08b
[0 1 2 3 4]

(2) 複数のNumPy配列を扱う場合

コード08bは複数のNumPy配列を扱うコードです。出力時に読み出す時の名前「s1, s2」を指定しています。

なお、ファイルの拡張子はnpzであり、出力時には拡張子を指定する必要がありません。

#コード08b
import numpy as np
import os

s_in1 = np.array([0, 1, 2, 3, 4])
s_in2 = np.array([5, 6, 7, 8, 9])

path_file = os.getcwd() + '\\dir_data\\data_np_08a'  #拡張子は不要
#代入先s1, s2は読み込み時の名前
np.savez(path_file, s1 = s_in1, s2 = s_in2)

path_file = os.getcwd() + '\\dir_data\\data_np_08a.npz'  #拡張子は必要
f = np.load(path_file)

s_out1 = f['s1']
s_out2 = f['s2']
print('s_out1', s_out1)
print('s_out2', s_out2)
#出力08b
s_out1 [0 1 2 3 4]
s_out2 [5 6 7 8 9]

9.オブジェクトをそのまま入出力(pickle)

クラスのオブジェクトなどをバイナリ形式で入出力できるのがpickleです。listや辞書だけでなくNumPy配列や自分で定義したクラスのインスタンスなども入出力できます。

なお、クラスのインスタンスのインスタンス変数なども、そのままの状態で保存できるので便利です。

(1) オブジェクトを1つだけ扱う場合

コード09aはlistオブジェクトを1つだけ扱う場合のコードです。

ファイルの拡張子は自由にしていできますが「.pkl」のような分かりやすい拡張子を指定する方がよいでしょう。

なお、「pickle.dump(s_list, f, -1)」の-1はpickle化するときのプロトコルバージョンを示します。負値を指定すると利用可能な最も高いプロトコルバージョンが指定され、省略するとデフォルトのプロトコルバージョンが指定されます。

また、「pickle.dump(s_list, f, protocol = 整数)」とすることで具体的なプロトコルバージョンを指定することができます。

#コード09a
import pickle
import os
s_list = [1, 2, 3]

path_file = os.getcwd() + '\\dir_data\\data_pickle_09a.pkl'
#書き込み用ファイルpath_fileをファイルオブジェクトfとして開く
with open(path_file, 'wb') as f:
    #オブジェクトx_listを、pickle化し、
    #ファイルオブジェクトfにs_listを追加し、ファイルpath_fileに出力
    pickle.dump(s_list, f, -1)

path_file = os.getcwd() + '\\dir_data\\data_pickle_09a.pkl'
#pickleデータフォーマットのファイルpath_fileを
#ファイルオブジェクトfとして読み込む
with open(path_file, "rb") as f:
    #ファイルオブジェクトfとして読み込んだpickleデータフォーマットの
    #ファイルpath_fileをオブジェクトに再構築し、x_listに代入
    s_list = pickle.load(f)

print(s_list)
#出力09a
[1, 2, 3]

(2) 複数のオブジェクトを扱う場合

コード09bは複数のlistオブジェクトを扱うコードです。ファイルに出力する場合はwith構文の中でdumpするたびに追記されます。また、ファイルから入力するときはloadするたびに順番に読み出されます。

#コード09b
import pickle
import os

s_list1 = [1, 2, 3]
s_list2 = [4, 5, 6]

path_file = os.getcwd() + '\\dir_data\\data_pickle_09b.pkl'
#書き込み用ファイルpath_fileをファイルオブジェクトfとして開く
with open(path_file, 'wb') as f:
    #オブジェクトx_listを、pickle化し、
    #ファイルオブジェクトfにs_listを追加し、ファイルpath_fileに出力
    pickle.dump(s_list1, f, -1)
    pickle.dump(s_list2, f, -1)

path_file = os.getcwd() + '\\dir_data\\data_pickle_09b.pkl'
#pickleデータフォーマットのファイルpath_fileを
#ファイルオブジェクトfとして読み込む
with open(path_file, "rb") as f:
    #ファイルオブジェクトfとして読み込んだpickleデータフォーマットの
    #ファイルpath_fileをオブジェクトに再構築し、x_listに代入
    s_list1 = pickle.load(f)
    s_list2 = pickle.load(f)

print(s_list1)
print(s_list2)
#出力09b
[1, 2, 3]
[4, 5, 6]

(3) インスタンスの入出力

クラスのインスタンスもコード09a, 09bと同じようにファイルに入出力することができます。

クラスX2のインスタンス変数であるyはデフォルトでは0ですが、メソッドcalc_yを実行することで実行結果をインスタンス変数yに保存できます。

出力09cより、pickle化してファイルに出力したインスタンスxは、コード09cの16行目でメソッドcalc_yで実行した結果をそのままの状態でファイルに保存できていることがわかります。

#コード09c
import pickle
import os

class Bai():
    def __init__(self, x):
        self.x = x
        self.y = 0
    
    def calc_y(self):
        self.y = self.x * 2

func = Bai(2)
print('ファイルへの出力前、calc_y実行前:',func.y)
func.calc_y()
print('ファイルへの出力前、calc_y実行後:',func.y)

path_file = os.getcwd() + '\\dir_data\\data_pickle_09c.pkl'
#書き込み用ファイルpath_fileをファイルオブジェクトfとして開く
with open(path_file, 'wb') as f:
    #オブジェクトx_listを、pickle化し、
    #ファイルオブジェクトfにオブジェクトfuncを追加し、ファイルpath_fileに出力
    pickle.dump(func, f, -1)

path_file = os.getcwd() + '\\dir_data\\data_pickle_09c.pkl'
#pickleデータフォーマットのファイルpath_fileを
#ファイルオブジェクトfとして読み込む
with open(path_file, "rb") as f:
    #ファイルオブジェクトfとして読み込んだpickleデータフォーマットの
    #ファイルpath_fileをオブジェクトに再構築し、funcに代入
    func = pickle.load(f)

print('ファイルからの入力データ:',func.y)
#出力09c
ファイルへの出力前、calc_y実行前 0
ファイルへの出力前、calc_y実行後 4
ファイルからの入力データ: 4

私が実際に購入した教材のご紹介

以下、私が実際に購入したPythonの教材をまとめてみました。 Pythonを学習する上で、少しでもお役に立つことができればうれしいです。

Python♪私が購入したPythonの書籍のレビュー
UdemyのPythonの動画講座を書籍を買う感覚で購入してみた

その他

Twitterへのリンクです。SNSもはじめました♪

液晶ペンタブレットを買いました
 (1) モバイルディスプレイを買うつもりだったのに激安ペンタブレット購入

以下、私が光回線を導入した時の記事一覧です。
 (1) 2020年「光回線は値段で選ぶ」では後悔する ←宅内工事の状況も説明しています。
 (2) NURO光の開通までWiFiルーターを格安レンタルできる
 (3) NURO光の屋外工事の状況をご紹介。その日に開通!
 (4) 光回線開通!実測するとNURO光はやっぱり速かった
 (5) ネット上のNURO光紹介特典は個人情報がもれないの?