PythonでExcelの区切り文字を痴〇(置換)した話


本題

へへへ、すけべなセルしてるじゃねえか

はい、題名の通りExcelファイルの中身を置換してCSVで保存する作業をpythonで自動化(?)した話です。

やりたいこと

Excelの特定の範囲から該当の個所を置換⇒CSVにして保存させたい。
今まではExcelの範囲を指定⇒サクラエディタに貼り付け⇒置換を3回⇒CSVとして保存してました。
なぜサクラエディタに貼り付けているのか?
一度手でやっていた作業を見てみましょう。

まず以下のようなExcelがあります。

はいここでF〇〇Kポイント1つ目、使用する場所はB列~E列、3行目から最終行(可変)です。

おいおい、なんだこのスケベな空欄とスケベな範囲は

範囲が変動(列は固定)なのはまあいいとして、これ空欄セルがあると読み込んだ時になぜかNoneで入ってくる時があるんですよね。そのせいで処理が少しめんどくなります。(後ほど説明)

じゃあ範囲を選択してコピー⇒サクラエディタに貼り付け、そして3回置換します。
1回目

2回目

3回目

完成したもの

はい、もうおわかりでしょうか。
そうです。(題に書いてる)

セルの文字ではなく区切り文字を置換しています。

おいおい、なんだこのスケry

やったこと

「python excel 置換」で検索すると文字を置換するのは普通に出てくるんですけど区切り文字置換がなかなか見つからないので苦戦しましたねぇ。
使うのはPythonのopenpyxlというパッケージです。
そもそもこれには区切り文字を指定することのできるdelimiterというものがあるのですが、delimiterで指定できるのは1文字のみという制限があります。今回の場合は区切り文字を","という3文字にしたいのでこれは使えませんでした。(使えないわけではないですが結局簡単にはいかない)
じゃあどうしたか、プログラムは以下です。

csv_ex.py
import openpyxl
#--------------------- excelファイル変換処理----------------------------
xlsx_file = r"C:\Users\user\Desktop\import\test.xlsx"
csv_file = "TEST.csv"
# エクセルブック
wb = openpyxl.load_workbook(xlsx_file, data_only=True)
# エクセルシート
ws = wb["Sheet1"]

for row in ws.iter_rows(min_row=3,min_col=2,max_col=5,values_only=True):
    row = list(row)
    row = ["" if x is None else x  for x in row]
    row = "\"" + "\",\"".join(map(str,row)) +"\"\r\n"
    with open(csv_file,"a",newline="") as f:
        f.write(row)

主な部分としては10行目以降ですね。
まず

csv_ex.py
for row in ws.iter_rows(min_row=3,min_col=2,max_col=5,values_only=True):

ここで読み込む範囲を指定します。rowに関してはスタート地点min_rowを指定、max_rowを記載しないことで記載があるところ(最終行)まで特定します。
列に関しては固定なのでmin_col,max_colを指定します。
最後のvalues_only=Trueでセルの値を取ってくるよう指定します。
11行目で、値はtuple型で帰ってきますが処理しやすいようリスト型に変換します。
12行目

csv_ex.py
row = ["" if x is None else x  for x in row]

前半で言いましたが空欄を読み込んだ時に時々Noneで返される時がありました。そのままCSVで保存するとセルにNoneが入るのでここでNoneを空欄に変換してます。
13行目

csv_ex.py
row = "\"" + "\",\"".join(map(str,row)) +"\"\r\n"

はい
まず無理やり行の前後に"をつけてます。
そして"\",\"".join(map(str,row))ここでリストとして取得した1行の各値を","を間に挟んで文字列とします。
例えば4行目だったら[S2346,Y,234,MT]というリストを取得してS2346","Y","234","MTという文字列を得る感じですね。
そして最後にCSVファイルに書き込んでいく、という処理を今回は作りました。

最後に

もうちょっときれいに作れたらよかったんですけど3文字の文字列ということで今回はこのような力業プログラムを作成しました。まあ実業務で作った奴はもうちょっと複雑なのですが、Excel変換につかれたエンジニアの手助けになればいいなと思います。
またQiitaの使い方になれていたいのですが、ここで作成したのはあくまで一例です。
これが正解ではないですし、もっといい方法があれば教えていただきたいです。