csvファイルの読み書き

csvファイルの読み書き

ついに、Pythonを使って何かします。
まずは、csvファイルの読み書きにチャレンジ。
これは、何かしらのデータを扱うことを考えると、csvファイルの読み書きは必須事項と考えたから。
やりたいことは以下の通り。
(A)予め作成しておいたcsvファイルを読み込む。
(B)読み込んでいることの確認のためにPyCharm上で表示する。
(C)読み込んだcsvファイルを中身はそのままで別ファイルとして書き込む。

(0)最終的なコード

 csvの読み込み、書き込みに結構時間がかかったが最終的なコードは以下に示すとおり。これで、上記(A)から(B)を実施している。最終的なコードになるまでの考え方はその下に示す。


from tkinter import filedialog  # ファイル読み取りダイアログ(Tkinter)を表示するのに必要なライブラリ。
import pandas as pd     # csv読み書きに必要なライブラリ。
import os   # ファイルパス取得に必要なライブラリ。

# csvフィルをGUIで読み取る。---Tkinterここから---
#「Python」、「ファイル」、「ダイアログ」で検索。
type = [('csvファイル','*.csv')]    # 読み取るファイルをcsvに絞り込む。
path = 'C:'   # ファイルを検索するパス(Cドライブ直下)を指定する。
file_path = filedialog.askopenfilename(filetypes = type, initialdir = path)    # これがダイアログ(GUI)本体と思われる。
# ---Tkinterここまで---

# pandasでcsvファイルを読み込ませて表示する。
df = pd.read_csv(file_path, engine="python", encoding="SHIFT-JIS")    # winで日本語を含んで作成されたcsvファイルに対応するためオプションでSHIFT-JISを追加。
print(df)       # 読み込んだcsvファイルを表示する。

# csvファイルのパスの拡張子を分離する(あとでファイル名を変更するため)。
print(file_path)  # 拡張子まで含めたファイルパスを確認。
file_path_name = os.path.splitext(file_path)[0]  # 拡張子を分離したファイルパスを取得。
print(file_path_name)  # 拡張子なしファイルパスを確認。

# ファイル名を変更する。
new_file_path = file_path_name + "_a" +".csv"    # ファイル名に"_a"を追記して拡張子を付加する。
print(new_file_path)    # "a"を追記したファイルパスを確認する。

# pandasでcsvファイルを書き込む、確認のために読み込んで表示する。
df.to_csv(new_file_path, index=False, encoding="SHIFT-JIS")   # 読み込んでいたcsvファイルを新ファイルパスに書き込む。行番号を削除を削除するためにindex=Falseとしている。
df = pd.read_csv(new_file_path, engine="python")    # 新ファイルパスからcsvファイルを読み込む。
print(df)       # 新ファイルパスcsvファイルを表示する。(中身は全く同じ)

(1)GUIによるファイル指定

 csvファイルの読み込みを「Python csvファイル 読み込み」等で検索するとファイルパスおよびファイル名を決め打ちのコードが記述されている場合が多い。でも、使用場面を考えると読み込みファイルをGUIで指定できるのが便利と考える。
なので、csvファイル読み込み前にGUIでファイル指定できる方法を探す。「Python GUI ファイル」で検索すると、Tkinterというものがヒットした。というか、ざっと見た感じではTkinter以外見つからなかった。なので、Tkinterを採用する。

(2)csv読み込み&表示

 csv読み込み方法に悩んだ。というのもcsv読み込みには複数の方法が存在してどれを使用しても表示までは問題なくできた。ただ、自分がしたいのは(C)で示しているように、読み込んだcsvファイルを中身はそのままで別ファイルとして書き込むこと。で、表示した内容がそのまま新しいcsvファイルとして書き込まれることを期待して「Python csvファイル 書き込み」等で検索した結果のcsv.writerを使ってみた。だがしかし、csvファイルは作成されるけど中身が空っぽだった(涙)。いろいろとやり方がまずいに違いないと考えつつ、もう少しググってみると、pandasを使用する方法が結構おすすめされてた。
 結論から言うと、pandasの使い方解説ページで示されていた通りに記述すると書き込みもうまく行ったのでcsv読み込みにもpandasを使用することとした。
 また、何も考えずに日本語を含んだcsvファイル(windows作成)を読みませると文字化けが発生したのでencoding=”SHIFT-JIS”で対処した。UTF-8の場合どうなるかは不明。まずは、手持ちのcsvファイルに対応したという形。

(3)csv書き込み

 そのまま書き込むと上書きされて終わってしまうので、オリジナルファイルを残すという意味とちゃんと書き込めたことの確認のためにファイル名を変更する。
 そのために、まずはファイルパスから拡張子を分離する。そして、拡張子を分離したファイルパスに_aとcsvの拡張子を追加した新ファイルパスを定義する。で、読み込んでいたcsvファイルを新ファイルパスにto_csvするだけでcsvファイルができてしまう。

(4)まとめ

 (相当時間がかかりましたが)csvファイルを読み込んで、別ファイル名として書き込むことができるようになりました。読み込んだcsvファイルを加工するというのはまだまだ先のことと思われますが、まずはプログラマーとして必要なスキルを一つ身につけた気がします。
 また、パスを確認(表示)するためにprint文をたくさん記述していますが、本来は数行で記述できると思われ、Pythonって便利だなぁって思いました。でもやっぱり、簡単ぢゃない。。。