【Python】ファイル入出力方法(numpy・Pandas他)

こんにちは、unogram管理人のうのちゅ〜です。

【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が扱えるようになると、様々な作業を自動化できるため、非常に便利です。