ファイルの入出力は実用的なプログラムではよく使う処理です
ここでは、テキストファイル、CSVファイル、JSONファイルについて入出力の方法を説明していきます
テキストファイルの読み書き
ファイルの入出力を行うためには、以下の手順を行う必要があります
・Step1:ファイルを「書き込みモード」または「読み込みモード」でオープン
・Step2:ファイルの読み書き
・Step3:ファイルのクローズ
では、この手順に従いテキストファイルに文字列を出力してみましょう
ファイルへの書き込み
ファイルをオープンするには以下のようにopen関数を使用します
ファイルオブジェクト = open(ファイル名,モード,encoding="文字エンコーディング")
open関数は指定したファイル名のファイルを開きファイルオブジェクトを返します
ファイルを開くことができなければエラーが送出されます
「ファイル名」は書き込み対象のファイル名を指定します
「モード」はファイルが開かれる際のモードを文字列で指定します
モードは以下の値を指定できます
モード | 機能 | ファイルがある場合 | ファイルがない場合 |
---|---|---|---|
r | 読み込み用に開く(デフォルト) | 先頭から読む | エラー |
w | 書き込み用に開きファイルを切り詰める | 破棄して上書き | 新規に作成する |
x | ファイルが存在しない場合のみ書き込み用に開く | エラーが送出される | 新規に作成する |
a | 書き込み用に開き、ファイルが存在する場合には末尾に追記する | 末尾に追記する | 新規に作成する |
・読み書きの両方に対応する場合、[r],[w],[a],[x]に[+]を付加します。
ファイルの有無による動作の違いは[r],[w],[a],[x]と等しくなります。
[r+],[w+],[a+],[x+]
・バイナリファイルを扱う場合、[r],[w],[a],[x],[r+],[w+],[a+],[x+]に[b]を付加します。
ファイルの有無による動作の違いは[r],[w],[a],[x]と等しくなります。
[rb],[wb],[ab],[xb]
[r+b],[w+b],[a+b],[x+b]
「encoding」はファイルを読み書きする文字エンコーディングを表します
省略した場合はPythonを実行しているプラットフォームに依存します
よく使いそうな一覧を以下に列挙します
名前 | 意味 |
‘utf-8’ | UTF-8 |
‘shift-jis’ | シフトJIS |
euc-jp | 日本語EUC |
ファイルへの書き込みにはファイルオブジェクトのwriteメソッドを使用し以下のように記述します
ファイルオブジェクト.write(文字列)
ファイルの書き込みが終わったら必ずファイルオブジェクトのcloseメソッドを呼び出します
ファイルオブジェクト.close()
with文とopen関数で以下のように記述することもできます
withブロックの終了時に自動的にクローズされ、閉じ忘れがなくなるので便利です
with open(ファイル名,モード,encoding="文字エンコーディング") as 変数:
変数.write()
文
as 変数と記述することでopenで取得したファイルオブジェクトが変数に代入されます
以下にテキストファイルに出力するサンプルプログラムを示します
fo = open("./test1.txt","w",encoding="utf-8")
fo.write("123\n")
fo.write("456\n")
fo.write("789\n")
fo.close()

ローカルフォルダにtest1.txtファイルが生成されます

ファイルの中身には、書き込んだ文字列がそれぞれ出力されています
with open("./test2.txt","w",encoding="utf-8") as fo:
fo.write("abc\n")
fo.write("def\n")
fo.write("123\n")


ファイルからの読み込み
次はテキストファイルを読み込んでみます
open関数のモードは”r”にします
読み込みに使うメソッドを以下のように呼び出します
ファイルオブジェクト.read()
前述のtest1.txtを読み込むサンプルプログラムを以下に示します
with open("./test1.txt","r",encoding="utf-8") as fo:
print(fo.read())
実行結果
123
456
789
テキストファイルから1行ずつ取り出す場合は、for文とファイルオブジェクトを使用して以下のように記述します
for 変数 in ファイルオブジェクト
文
前述のtest1.txtを1行ずつ読み込むサンプルプログラムを以下に示します
with open("./test1.txt","r",encoding="utf-8") as fo:
for line in fo:
print(line,end="")
実行結果
123
456
789
読み込んだテキストの行末には改行が含まれているため、print関数で表示する際は、キーワード引数のendに空文字(’’)を指定して改行の出力を抑制しています
【演習問題】
- リストに含まれる文字列を1行ずつファイルに出力してみましょう
リストは次の通り定義します
s1 = [“Tokyo”,”Osaka”,”Nagoya”]
出力結果(ファイルの中身のダンプ)
Tokyo
Osaka
Nagoya
- 1で出力したファイルから1行ずつよみこみ、リストを生成し表示してみましょう
実行結果
['Tokyo', 'Osaka', 'Nagoya']
CSVファイルの読み書き
CSVファイルは、複数の値をカンマ(,)で区切ったテキストファイルです
テキストエディタで編集や閲覧をすることができますし、ExcelなどのソフトウエアもCSVファイルの入出力に対応しています
標準ライブラリのcsvモジュールを使うとCSVファイルの入出力が可能です
ここではcsvモジュールを使い入出力する方法を説明します
参考URL:https://docs.python.org/ja/3/library/csv.html
まず、csvモジュールをインポートします
import csv
CSVの出力
CSVファイルに出力するには、以下のようにcsvモジュールのwriterオブジェクトを作成した後に、writerowメソッドやwriterowsメソッドを呼び出します
with open(ファイル名,'w',encoding=文字エンコーディング,newline='' ) as ファイル:
csvwriter = csv.writer(ファイル)
csvwriter.writerow(iterable)
csvwriter.writerows(someiterable)
with open(ファイル名,'w',encoding=文字エンコーディング,newline='' ) as ファイル:
newline=”を指定しない場合、環境によっては改行(\r\n)に余分な\rが追加されるため、newline=”と書くとよいです
csvwriter = csv.writer(ファイル)
writerオブジェクトを生成しています
csvwriter.writerow(iterable)
writerowメソッドは引数のiterableを1行書き込みます
※引数にはリストやタプル、辞書などfor文で繰り返し処理ができるオブジェクト(イテラブル)を渡します
csvwriter.writerows(someiterable)
writerowsメソッドは一度に複数行を書き込みます
以下にCSV出力するサンプルプログラムを示します
import csv
dl = [(1,'ja','japanease'),
(2,'en','english'),
(3,'ch','chinease')
]
with open("./test3.csv","w",encoding="utf-8",newline='') as fo:
csvwriter = csv.writer(fo)
for row in dl:
csvwriter.writerow(row)
出力結果(test3.csvのダンプ)
1,ja,japanease
2,en,english
3,ch,chinease
for row in dl:
csvwriter.writerow(row)
dlで定義したリストの中のタプルを一つずつ取り出してwriterowメソッドの引数とし、出力します
writerowsメソッドを使ったサンプルプログラムを以下に示します
with open("./test3.csv","w",encoding="utf-8",newline='') as fo:
csvwriter = csv.writer(fo)
csvwriter.writerows(dl)
出力結果(test3.csvのダンプ)
1,ja,japanease
2,en,english
3,ch,chinease
出力結果は同じになります
csvの読み込み
CSVファイルを読み込む時は、csv.readerメソッドを用いて、以下のように記述すると1行ずつ読み込むことができます
with open(ファイル名,"r",encoding=文字エンコーディング,newline="") as ファイル:
for 変数 in csv.reader(ファイル):
文
CSVの書き込みで作成したファイルを読み込んだサンプルプログラムを以下に示します
import csv
with open("./test3.csv","r",encoding="utf-8",newline='') as fo:
reader = csv.reader(fo)
for row in reader:
print(row)
実行結果
['1', 'ja', 'japanease']
['2', 'en', 'english']
['3', 'ch', 'chinease']
【演習問題】
- 以下のような出力ファイルになるようにCSVファイルへ出力してみましょう
実行結果(出力ファイルのダンプ)
coffee,350,2
tea,300,4
water,0,5
milk,200,1
juice,150,2
- 1で作成したファイルを読み込み、各行をリストに追加し、作成できたリストを出力するプログラムを作成してみましょう
[['coffee', '350', '2'], ['tea', '300', '4'], ['water', '0', '5'], ['milk', '200', '1'], ['juice', '150', '2']]
JSONファイルの読み書き
JSONファイルとはJSONというデータ形式で記述されたファイルのことで、ファイルの拡張子は「.json」です
JSONファイルはコンピュータ間でプログラミング言語に依存せず、データをやり取りするときに用いられます
JSON形式の読み書きを行うためには、JSONモジュールをインポートする必要があります
参考URL:https://docs.python.org/ja/3/library/json.html
import json
JSON形式でファイルを出力するには、open関数でファイルをオープン後、json.dumpメソッドを使用し以下のように記述します
with open(ファイル名,"w",encoding=文字エンコーディング) as ファイル:
json.dump(イテラブル,ファイル,indent=整数,ensure_ascii=False)
イテラブルは書き出したいオブジェクトを指定します
indentを指定すると、JSONファイルにインデントや改行が入るので、見やすくなります
ensure_ascii=Falseと指定すると、日本語などの文字列がエスケープされることなく出力されます
JSONファイルに書き込むサンプルプログラムを示します
「No」と「コード」と「名前」のキーを持つ辞書をそれぞれ定義し、リストにまとめています
import json
l = [
{"No":1,"コード":"ja","名前":"japanease"},
{"No":2,"コード":"en","名前":"english"},
{"No":3,"コード":"ch","名前":"chinease"}
]
with open("./test6.json","w",encoding="utf-8") as fo:
json.dump(l,fo,ensure_ascii=False,indent=2)
出力結果(test6.jsonのダンプ)
[
{
"No": 1,
"コード": "ja",
"名前": "japanease"
},
{
"No": 2,
"コード": "en",
"名前": "english"
},
{
"No": 3,
"コード": "ch",
"名前": "chinease"
}
]
JSONファイルにおいて角括弧([])で囲まれた要素は「配列」と呼ばれていて、Pythonのリストに対応します
波括弧({})で囲まれた要素はオブジェクトと呼ばれ、Pythonの辞書に対応します
with open("./test6.json","w",encoding="utf-8") as fo:
出力先のファイルをオープンします
json.dump(l,fo,ensure_ascii=False,indent=2)
indent,ensure_asciiをそれぞれキーワード引数で定義しリストを出力します
次にJSONファイルを読み込んでみましょう
まずopen関数で対象とファイルをオープン後、json.loadメソッドを使用使います
with open(ファイル名,"r",encoding=文字エンコーディング) as ファイル:
変数 = json.load(ファイル)
JSONの書き込みで作成したtest6.jsonファイルを読み込んだサンプルプログラムを以下に示します
with open("./test6.json","r",encoding="utf-8") as fo:
l = json.load(fo)
print(l)
for item in l:
print(str(item['No'])+":"+item['名前']+"("+item['コード']+")")
実行結果
[{'No': 1, 'コード': 'ja', '名前': 'japanease'}, {'No': 2, 'コード': 'en', '名前': 'english'}, {'No': 3, 'コード': 'ch', '名前': 'chinease'}]
1:japanease(ja)
2:english(en)
3:chinease(ch)
【演習問題】
- menu、価格、数量をキーに持つ辞書をまとめリストに格納した上で、menulist.jsonというJSONファイルを出力してみましょう
出力結果
[
{
"menu": "coffee",
"単価": 350,
"数量": 2
},
{
"menu": "tea",
"単価": 300,
"数量": 4
},
{
"menu": "water",
"単価": 0,
"数量": 5
},
{
"menu": "milk",
"単価": 200,
"数量": 1
},
{
"menu": "juice",
"単価": 150,
"数量": 2
}
]
- 1で作成したmenulist.jsonファイルを読み込み、以下のように出力してみましょう
実行結果
coffee:単価350円
販売数量:2 小計:700円
***************
tea:単価300円
販売数量:4 小計:1200円
***************
water:単価0円
販売数量:5 小計:0円
***************
milk:単価200円
販売数量:1 小計:200円
***************
juice:単価150円
販売数量:2 小計:300円
***************
コメント