質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

Python リスト型のCSV出力の事例をネット記事からコピペするも、期待したとおり収まっていない!

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 474

saya24

score 152

本件はこちらの案件に続く内容です。

リスト型のデータをCSV出力する機能を、ネットの記事から複写し、ご支援を頂きなんとかファイル出力まで至ったのですが
実際仕上がったファイルを開けてみると、期待する結果ではありませんでした。

・データ行が 文字単位に列へ格納されてしまっている
・1行のレコードを期待していたが、無駄に空白行が入っている
・1行のレコードを期待していたが、列展開ではなく、行展開されている
という点を解決したいです。

現況のコードは以下のとおりです。

import csv

output_data = ["書き込む", "データ", "だよ"]

with open("file.csv", "w") as f:
    writer = csv.writer(f)

    # csv用のヘッダーがデータにない場合は先に書いておく
    writer.writerow(["header", "data", "だよ"])

    for data_row in output_data:
        writer.writerow(data_row)

このコードから生成されたCSVファイルはこちらです。
あれれ

参考にした記事が良くないのでしょうか?(元の記事

【質問】
ヘッダを除くと 3列1レコードのCSVファイルを出力するには どういった変更を 当該コードに加えればよろしいのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

CSV は、N行M列の表データを表す形式なので、output_data は1次元配列ではなく、2次元配列となっているべきではないでしょうか。

import csv

output_data = [
    # 1列目 2列目   3列目
    ["AAA", "BBB", "CCC"],  # 1行目
    ["AAA", "BBB", "CCC"],  # 2行目
    ["AAA", "BBB", "CCC"],  # 3行目
    ["AAA", "BBB", "CCC"],  # 4行目
]

with open("file.csv", "w") as f:
    writer = csv.writer(f)

    # csv用のヘッダーがデータにない場合は先に書いておく
    writer.writerow(["header", "data", "だよ"])

    for data_row in output_data:
        writer.writerow(data_row)

参考にした記事が良くないのでしょうか?

おかしいので別のサイトを参考にしたほうがいいと思います。

追記

コメントのような辞書のリストになっているのであれば、csv.DictWriter を使えば、変換なしにそのまま書き込めます。

import csv

output_data = [
    {"Name": "Alice", "Age": 40, "Point": 80},
    {"Name": "Bob", "Age": 20, "Point": 60},
    {"Name": "Charlie", "Age": 30, "Point": 70},
]

header = list(output_data[0].keys())  # 列の順番を規定
print(header)  # ['Name', 'Age', 'Point']

with open("output.csv", "w", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=header)
    writer.writeheader()  # ヘッダーを書き込む
    writer.writerows(output_data)  # データを書き込む

出力結果

Name,Age,Point
Alice,40,80
Bob,20,60
Charlie,30,70

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/20 11:28

    インデントが崩れて見えるのは ご容赦ください。

    キャンセル

  • 2020/05/20 12:29

    追記しました。このような意図であっていますか。

    キャンセル

  • 2020/05/20 12:52

    ありがとうございます、合っています。そして試してみて、期待の結果を得られることを確認しました。
    やはり聞いてよかったです。
    世間一般的でない解決策だと、あとから自分のコードを覗いた方に対し 恥ずかしいので。

    本件クローズします、至れり尽くせりの対応感謝を申し上げます。

    キャンセル

+1

    for data_row in output_data:
        writer.writerow(data_row)


の部分で、output_dataを分解して1行ずつ書き込んでますよね?このままでは文字毎に分解されてしまいますので、複数行を想定するなら、

output_data = [["書き込む", "データ", "だよ"]]


と定義するべきでしょう。
また、空白行が入るのはWindows環境だからです。openするときに、

with open("file.csv", "w", newline='') as f:


としてみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/20 09:28

    x98000さん ありがとうございます、無事に期待の結果を得られました。
    For文をちゃんと理解すれば文字単位にでることは当然の結果でしたね、ご説明頂きありがとうございました。Windowsの場合は、ファイルオープン時に改行のオプションを指定する必要があったのですね。
    非常に丁寧な説明で助かりました。

    キャンセル

+1

ヘッダー出力同様に下記で良いのではないでしょうか?

writer.writerow(output_data)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/20 09:20

    meg_さん ご見解ありがとうございます、試させて頂きました。

    For文の代替えで ご提示のようにしましたら、目的のレコードが列展開されました。
    ただ、ヘッダ行と実際今回無事に出力されたレコードの間に 空白があらわれておりました。

    引き続き、他の方のご見解を試してまいりますね。貴重なお時間を頂きありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • Pythonに関する質問
  • Python リスト型のCSV出力の事例をネット記事からコピペするも、期待したとおり収まっていない!