

Pythonでテキストにある内容をリスト化してCSVに出力したいのですが、やり方が分からなくて困っています。  
調べたものでコードを作ってみたのですが、想像している動きではないので皆様のお力が欲しいです。

**対象のテキストファイル**

[code]

    名前:A
    クラス:B
    学年:C
    成績:D
    
    名前:AA
    クラス:BB
    学年:CC
    成績:DD
    
[/code]

以上の `:` 以降の内容を、Pythonで次のようにリスト化し

  * `[A,B,C,D]`
  * `[AA,BB,CC,DD]`

さらに最終的に `,` で区切ってCSVに出力したいです（下図の通り）。

[![期待されるExcel出力](https://i.stack.imgur.com/uc4Mo.png)](https://i.stack.imgur.com/uc4Mo.png)

自分では以下のようなPythonコードが書けましたが、これをより短いコードで、期待通りの出力を得られるようにする方法をご教示いただけますと幸いです。

**現状のコード:**

[code]

    with open(r"txtファイル",encoding='utf-8') as f:
        lines = f.readlines()
        stat = 0
        for line in lines:
            if stat == 0:
                if(line.startswith("名前:")):
                    print(line.strip("名前:"))
                    stat = 1
    
        for line in lines:
            if stat == 1:
                if(line.startswith("クラス")):
                    print(line.strip("クラス:"))
                    stat = 2
    
        for line in lines:
            if stat == 2:
                if(line.startswith("学年:")):
                    print(line.strip("学年:"))
                    stat = 3
    
        for line in lines:
            if stat == 3:
                if(line.startswith("成績:")):
                    print(line.strip("成績:"))
    
[/code]


CC BY-SA 4.0
2022-02-28T01:23:12.677
86604
2022-03-14T05:09:13.387
2022-03-07T12:05:47.497
3060
51630
question
python csv
Pythonでテキストファイルの内容をリスト化してCSVで出力する


pandas と openpyxl がインストールされている環境で  
成績：D

名前：AA  
の「成績：D」と「名前：AA」の間が改行だけの空行の前提になります。

[code]

    import pandas as pd
    
    df = pd.read_table(r"txtファイル", encoding='utf-8', header=None, engine='python', sep=':')
    item_num = len(set(df.values[:,0]))
    ary = df.values[:,1].reshape(-1, item_num)
    df2 = pd.DataFrame(ary, columns=df.values[0:item_num,0])
    df2.to_excel('data2.xlsx', header=True, index=False)
    
[/code]

標準のリスト型のデータが欲しい場合は、上記 ary からリストにしてください。

[code]

    lst = list(map(list, ary))
    print(lst)
    # [['A', 'B', 'C', 'D'], ['AA', 'BB', 'CC', 'DD']]
    
[/code]


CC BY-SA 4.0
2022-02-28T02:21:26.633
86605
2022-03-14T04:38:24.333
2022-03-14T04:38:24.333
43025
41756
86604
answer


##### Pandas モジュールを使う場合

[code]

    import pandas as pd
    
    with open(r'result_sheet.txt', encoding='utf-8') as f:
      records = [
        dict(j.split(':') for j in i.split('\n') if j)
        for i in f.read().replace('\r', '').split('\n\n') if i
      ]
    
    
    df = pd.DataFrame(records)
    df.to_excel('result_sheet.xlsx', index=False)
    
[/code]

[![table](https://i.stack.imgur.com/ME7pf.png)](https://i.stack.imgur.com/ME7pf.png)

##### CSV モジュールを使う場合

[code]

    import csv
    
    with open(r'result_sheet.txt', encoding='utf-8') as f:
      records = [
        dict(j.split('：') for j in i.split('\n') if j)
        for i in f.read().replace('\r', '').split('\n\n') if i
      ]
    
    with open('result_sheet.csv', 'w') as f:
      writer = csv.DictWriter(f, fieldnames=records[0].keys())
      writer.writeheader()
      for r in records:
        writer.writerow(r)
    
[/code]

**result_sheet.csv**

[code]

    名前,クラス,学年,成績
    A,B,C,D
    AA,BB,CC,DD
    
[/code]


CC BY-SA 4.0
2022-02-28T02:30:00.637
86606
2022-03-14T05:09:13.387
2022-03-14T05:09:13.387
3060
47127
86604
answer