LoginSignup
0
0

More than 1 year has passed since last update.

Pythonで二次元配列をcsv形式に変換したい

Last updated at Posted at 2023-01-26

業務で二次元配列のデータをcsv形式に変換する必要があり、
思ったより苦戦したので、記録として残してみました。

元となるデータ

業務のデータをそのまま使うわけにはいかないので、
こちらのデータを使用していきます。

test_data = [['りんご', 'みか\n'], ['いちご', '""'], ['ブドウ', 'キウ,イ']]
result = "" # 変換後のデータを格納する

最初に自分で考えた処理

for i in range(len(data)):
    keep = ",".join(data[i])
    if (i == 0):
        result = keep
    else:
        result = result + "\n" + keep

ひどいですね。。笑
かなり分かりにくい書き方なうえに、
エスケープ文字にも対応できていません。

上司に相談したところ、「リスト内包表記」 というのが、
for分の代わりに使えるとのことでした。
なので、ひとまずエスケープ文字は無視して、
全体の処理を整理していこうと思います。

リスト内包表記って?

[式 for 任意の変数 in イテラブルオブジェクト]

こんな感じで書くみたいです。
イテラブルオブジェクトは、繰り返し可能なオブジェクトのことで、
「リスト」とか「タプル」とか「range関数」が該当するとのこと。

リスト内包表記を使ってみた

result = [",".join(test_data[x]) for x in range(len(test_data))]
newline_result = "\n".join(result)

かなり見やすくなりました!
ただ、まだrangeの部分だったり2行になってしまっていたりで、無駄が多いです。

1行にまとめてみた

 result = "\n".join([",".join(x) for x in test_data])

最初に比べると、見違えるように見やすい、、、!

エスケープ文字に対応させた

result = "\n".join([",".join(['"' + y.replace('"', '""') + '"' for y in x]) for x in test_data])

エスケープ文字にも対応できました👍

まとめ

リスト内包表記とは初めての出会いでしたが、
うまく使えば処理が見やすくなりますね。
ただ何でもかんでも1行にまとめればいい、
というわけでもないので、注意して使っていこうと思います!

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0