こんにちは、管理人のウノケンです。
【Python】シリーズ第1回として、Pythonにおけるファイル入出力について解説していきます。
Pythonのファイル入出力は様々なやり方がありますよね。今回は次の3通りの入出力について、CSVファイルを主な対象として解説します。
- 標準ライブラリ
- numpy
- Pandas
ファイル入出力はPythonの基礎なのでしっかり使いこなせるようにしましょう!
以下の書籍で学べるファイル操作など、各種処理にも応用できます。
numpyについては、【numpyの基礎】ベクトルの生成、逆順、転置(行と列の入れ替え)や【numpyの基礎】行列の基本(単位行列、乱数行列、線形代数)で解説しているので、こちらもご覧ください。
それでは見ていきましょう!
Pythonのファイル入出力方法(標準ライブラリ・numpy・Pandas)
Python標準ライブラリを使ったファイル入出力
標準ライブラリcsvをインポートしてファイル入出力を行います。
数値データを1行書き込む(ファイル新規作成)
ファイルの新規作成の場合、書き込みを意味するモード’w’とします。
1行の書き込みにはcsv.writer.writerowを使用します。
import csv
with open('./csv_test0.csv', 'w') as f:
writer = csv.writer(f)
writer.writerow([i for i in range(1,10)])
with open('./csv_test0.csv') as f:
print(f.read())
# 1,2,3,4,5,6,7,8,9
文字列データを1行書き込む(ファイル新規作成)
文字列の場合も同様です。
with open('./csv_test1.csv', 'w') as f:
writer = csv.writer(f)
writer.writerow(['a', 'b', 'c', 'd', 'e'])
with open('./csv_test1.csv') as f:
print(f.read())
# a,b,c,d,e
数値データを複数行書き込む(ファイル新規作成)
複数行の書き込みにはcsv.writer.writerowsを使用します。
outputrows =[[i*j for j in range(1,10)] for i in range(1,4)]
with open('./csv_test2.csv', 'w') as f:
writer = csv.writer(f)
writer.writerows(outputrows)
with open('./csv_test2.csv') as f:
print(f.read())
# 1,2,3,4,5,6,7,8,9
# 2,4,6,8,10,12,14,16,18
# 3,6,9,12,15,18,21,24,27
既存ファイルへの書き込み
存在するファイルに追記したい場合は、モードを追記を意味する’a’とします。
書き込むデータは既存ファイルの末尾に書き込まれます。
outputrows_add = [[i*j for j in range(1,10)] for i in range(4,7)]
with open('./csv_test2.csv', 'a') as f:
writer = csv.writer(f)
writer.writerows(outputrows_add)
with open('./csv_test2.csv') as f:
print(f.read())
# 1,2,3,4,5,6,7,8,9
# 2,4,6,8,10,12,14,16,18
# 3,6,9,12,15,18,21,24,27
# 4,8,12,16,20,24,28,32,36
# 5,10,15,20,25,30,35,40,45
# 6,12,18,24,30,36,42,48,54
既存ファイルへの上書きを防ぎたい場合
モード’w’で書き込むと、既にファイルが存在する場合でも上書きされてしまいます。
既存ファイルへの上書きを防ぎたい場合は、モードを’x’に指定します。
with open('./csv_test0.csv', 'x') as f:
writer = csv.writer(f)
writer.writerow([i for i in range(1,10)])
# 既にcsv_test0.csvが存在する場合、以下のようにエラーとなります。
# FileExistsError: [Errno 17] File exists: './csv_test0.csv'
with open('./csv_test3.csv', 'x') as f:
writer = csv.writer(f)
writer.writerow([i for i in range(11,20)])
with open('./csv_test3.csv') as f:
print(f.read())
# csv_test3.csvは存在しないため、エラーとならずにCSVファイルが出力されます。
# 11,12,13,14,15,16,17,18,19
numpyを使ったファイル入出力
数値計算ライブラリnumpyをインポートしてファイル入出力を行います。
ndarray形式の数値データをそのまま入出力できます。
出力されたtxtファイルの中身は、デフォルトでは指数表記で保存されている点には注意しましょう。
a = np.arange(1,10).reshape(3,3)
print(a)
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
np.savetxt('./csv_test_np1.txt',a)
#デフォルトのtxtファイルの中身は、以下のように指数表記で保存されます。
# 1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00
# 4.000000000000000000e+00 5.000000000000000000e+00 6.000000000000000000e+00
# 7.000000000000000000e+00 8.000000000000000000e+00 9.000000000000000000e+00
b=np.loadtxt('./csv_test_np1.txt')
print(b)
# [[1. 2. 3.]
# [4. 5. 6.]
# [7. 8. 9.]]
Pandasを使ったファイル入出力
データ解析でよく使用されるライブラリPandasをインポートしてファイル入出力を行います。
上の2つの方法に比べると、単純なファイル入出力をする上では少し複雑に見えますが、データ分析に活用する上では便利なので覚えておきましょう。
indexやheaderの設定によって入出力のされ方が変わるので注意しましょう。
import pandas as pd
df = pd.DataFrame([
['taro', '15', '160'],
['hanako','20', '165']],
columns=['name', 'age', 'height'])
df.to_csv('./csv_test_pd1.csv', index=False)
# name age height
# taro 15 160
# hanako 20 165
# index=Falseを指定しない場合、インデックスが追加された状態で保存されます。
# name age height
# 0 taro 15 160
# 1 hanako 20 165
df = pd.read_csv('./csv_test_pd1.csv')
print(df)
# name age height
# 0 taro 15 160
# 1 hanako 20 165
日本語を含む場合
日本語を含む場合も同様です。
df = pd.DataFrame([
['太郎', '15', '160'],
['花子','20', '165']],
columns=['名前', '年齢', '身長'])
df.to_csv('./csv_test_pd2.csv', index=False)
df = pd.read_csv('./csv_test_pd2.csv')
print(df)
# 名前 年齢 身長
# 0 太郎 15 160
# 1 花子 20 165
モード指定(追記/上書き防止)
pandasでも、追記する場合/上書きを防止したい場合にモードを指定します。
df = pd.DataFrame([
['次郎', '10', '150']],
columns=['名前', '年齢', '身長'])
df.to_csv('./csv_test_pd2.csv', mode='a', index=False, header=False)
# header =Falseを指定しないとcolumnsも追記されてしまうので注意しましょう。
df = pd.read_csv('./csv_test_pd2.csv')
print(df)
# 名前 年齢 身長
# 0 太郎 15 160
# 1 花子 20 165
# 2 次郎 10 150
列の追記
Pandasでは簡単に列の追記が可能です。
df = pd.read_csv('./csv_test_pd2.csv')
print(df)
# 名前 年齢 身長
# 0 太郎 15 160
# 1 花子 20 165
# 2 次郎 10 150
df['血液型'] = ['A', 'B', 'O']
df.to_csv('./csv_test_pd3.csv', index=False)
df = pd.read_csv('./csv_test_pd3.csv')
print(df)
# 名前 年齢 身長 血液型
# 0 太郎 15 160 A
# 1 花子 20 165 B
# 2 次郎 10 150 O
まとめ
今回は【Python】シリーズ第1回として、Pythonにおけるファイル入出力について解説してきました。
いろいろな状況で自由にCSVなどのファイル入出力ができるように、それぞれの記法を押さえておきましょう。
参考書学習は…
Pythonの参考書はたくさんありますが、広範な内容を網羅的に扱っている点で、オライリー・ジャパンの参考書がおすすめです。
ある程度Pythonが扱えるようになると、様々な作業を自動化できるため、非常に便利です。