Pythonでテキストファイルの出力
print()で出力する
テキストファイルを出力するにはファイルオブジェクトを開き,書き込んでいきます.closeを忘れがちなので,with open()により自動的にファイルを閉じるようにするとよいでしょう.
最も簡単な方法はprint()関数でfile=foutを指定するものです.この指定がなければ通常通りモニターに表示されます.通常と同様にカンマで区切って複数の文字列をスペース区切りで出力できます.
print()はさらにsep=とend=の2つの引数を取ります.sep=ではセパレータを指定し,デフォルトでは半角スペースです.end=は末尾の文字を指定し,デフォルトは改行("\n")になります.
print()の代わりにwrite()関数を用いるとセパレータなし,末尾の文字なしになります.
[cc]
In [46]: with open("output.txt", "wt") as fout:
...: print("first line", file=fout)
...: print("second", "line", file=fout, sep=",", end="") # ","区切り,改行なし
...:
[/cc]
CSV moduleで出力する
CSV形式(セパレータは変更可能)で出力するにはCSVモジュールを使うのが便利です.pandasのデータフレームdfを書き出すことを考えます.なお,後述するようにdf.to_csv()でも書き出せます.
[cc]
In [52]: from pandas import Series, DataFrame
In [53]: import pandas as pd
In [54]: import numpy as np
In [55]: import csv
In [56]: df=DataFrame(np.arange(12.).reshape((4,3)), columns=["X","Y","Z"],
...: ...: index=['Tokyo','Nagoya','Kyoto','Osaka'])
...:
In [57]: df
Out[57]:
X Y Z
Tokyo 0.0 1.0 2.0
Nagoya 3.0 4.0 5.0
Kyoto 6.0 7.0 8.0
Osaka 9.0 10.0 11.0
In [59]: with open('output.txt', 'wt') as fout:
...: csvout = csv.writer(fout)
...: csvout.writerows(df.values)
...:
[/cc]
このときoutput.txtの中身は以下のようにカンマ区切りで出力されます.
[cc]
0.0,1.0,2.0
3.0,4.0,5.0
6.0,7.0,8.0
9.0,10.0,11.0
[/cc]
df.valuesの代わりにdfとすると,column名が出力されました.df.columnsおよびdf.columns.valuesを渡しても同じ結果でした.
[cc]
X
Y
Z
[/cc]
writerowsは引数を一つのみ取りますので,一部を出力するといった場合は予めdfを加工しておく必要があります.
より細かく制御するためには結局dfをリスト化し,forループを回してprint()で書くのが早そうです.
pandasの.to_csv()で書き出す
df全体を出力するには以下のようにします.
[cc]
In [67]: df
Out[67]:
X Y Z
Tokyo 0.0 1.0 2.0
Nagoya 3.0 4.0 5.0
Kyoto 6.0 7.0 8.0
Osaka 9.0 10.0 11.0
In [68]: df.to_csv('output.txt')
[/cc]
このとき,以下のようにindexとheader(column名)を含んだファイルが出力されます.
[cc]
,X,Y,Z
Tokyo,0.0,1.0,2.0
Nagoya,3.0,4.0,5.0
Kyoto,6.0,7.0,8.0
Osaka,9.0,10.0,11.0
[/cc]
以下のようにsep=でセパレータを指定したり,indexやheaderを非表示にしたり,一部のcolumn(列)だけを指定した順に出力することができます.
[cc]
In [71]: df.to_csv('output.txt', sep=' ', index=False, header=True, columns=['Z','X'])
[/cc]
このときファイルの中身は以下のようになります.
[cc]
Z X
2.0 0.0
5.0 3.0
8.0 6.0
11.0 9.0
[/cc]
既存のファイルにpandasの.to_csv()で追記(append)
既存のファイルに追記(append)するのも簡単にできます.そのファイルを'a'モードで開き,書き出し時にそのファイルオブジェクトを指定するだけです.結局,.to_csv()は便利ですね.
[cc]
In [72]: with open('output.txt', 'a') as f:
...: df.to_csv(f)
[/cc]
output.txtに追記したので,中身は以下の様に更新されます.
[cc]
Z X
2.0 0.0
5.0 3.0
8.0 6.0
11.0 9.0
,X,Y,Z
Tokyo,0.0,1.0,2.0
Nagoya,3.0,4.0,5.0
Kyoto,6.0,7.0,8.0
Osaka,9.0,10.0,11.0
[/cc]
df.to_csv()で浮動小数点のフォーマットを指定する
出力に際し,浮動小数点floatの桁数を指定するには引数のfloat_formatを指定します.
[cc]
df.to_csv(f, float_format='%.3f')
[/cc]
とすれば,小数点以下3桁に整形して出力されます.float_format=' %.3f'とすれば,数値の左に2つ分のスペースが空きます.float_format='%8.3f'では小数点を含め8桁分確保し,小数点以下3桁で右詰で出力されます.