93038


CSVモジュールを使って、以下2つのコード（sample-01／02.py）でリストをCSVファイルへ書き出しを行っているのですが、意図した結果となりません。  
以下の違いの説明をいただけたらと思います。

[code]

    # 意図した結果
    aaa
    bbb
    
[/code]

[code]

    # sample-01.py
    
    import csv
    list_a = ['aaa', 'bbb']
    
    with open('sample-01.csv', 'w', newline="") as f:
        writer = csv.writer(f)
        writer.writerows(list_a)
    
    
[/code]

[code]

    #sample-01.csv
    
    a,a,a
    b,b,b
    
[/code]

[code]

    # sample-02.py
    
    import csv
    
    list_a = ['aaa', 'bbb']
    with open('sample-02.csv', 'w', newline="") as f:
        writer = csv.writer(f)
        for li in list_a:
                writer.writerow(li)
    
[/code]

[code]

    # sample-02.csv
    
    a,a,a
    b,b,b
    
[/code]


CC BY-SA 4.0
2022-12-27T05:27:19.887
93036
2022-12-27T12:06:12.923
2022-12-27T12:06:12.923
3060
question
python python3
1次元配列からCSV出力が意図した結果にならない


以下は, 横に並べたものと, 縦に並べたものです

[code]

    import csv
    import io
    
    list_a = ['aaa', 'bbb']
    with io.StringIO() as fp:
        writer = csv.writer(fp)
        writer.writerow(list_a)   # list_a は一行分のカラム
    
        for row in list_a:
            writer.writerow([row])   # 縦並び (1行分は 1項目のリストを指定)
    
        res = fp.getvalue()
    
    print(res)
    # aaa,bbb
    # aaa
    # bbb
    
[/code]

`.writerow()` には, リストのようなもの(イテラブル) を指定し  
`.writerows()` の場合は, リストのリスト的なもの(row のイテラブル) を指定

質問の `writer.writerows(list_a)` あるいは `writer.writerow(li)` では,
目的とする出力には次元がひとつずつ足りない。

また, 文字列もイテラブルであり このため一文字ずつ扱われます

[code]

    for c in 'abcde':
        print(c)
    a
    b
    c
    d
    e
    
[/code]

以上のことから, `.writerows()` 使って1項目ずつ書き込むには次のようなデータ構造が必要になります

[code]

        rows = [['一行目'],
                ['二行目'],
                ['三行目']]
        writer.writerows(rows)
    
[/code]


CC BY-SA 4.0
2022-12-27T07:21:10.530
93038
2022-12-27T10:03:45.780
2022-12-27T10:03:45.780
43025
43025
93036
answer