67919


皆様はじめまして。  
Pythonを始めたばかりで今回質問させていただきました。

指定のCSVファイル「input.csv」から内容を取り込み、書き出す際は「input.csv」の元ヘッダーは使わず、用意したヘッダーに差し替え、カンマ区切り、認識コードの列は除外して「output.csv」に出力しようとしています。

しかし、ヘッダーは指定したものが書き出されていますが、整形された「input.csv」の内容が出力されません。

**output.csv (出力されたCSV)**

[code]

    差出名称,内部印字区分,外部仕分区分
    
    
    
[/code]

**実行時のエラーメッセージ**

[code]

    Traceback (most recent call last):
      File "csv_convert.py", line 21, in <module>
        outptfile.write(row)
    TypeError: write() argument must be str, not list
    
[/code]

エラーがTypeErrorということで正しい型の書き方にしないといけないのは理解できますが、恥ずかしながら思い通りな書き方が思いつかず、全体のコード自体も間違いだらけだと思いますが今回質問させていただきました。

ご教示頂ければ幸いです。どうぞよろしくお願い致します。

**開発・実行環境**  
Windows 10 Home OSビルド19041.329  
Python 3.7.7

* * *

**input.csv (読み込むCSV)**

[code]

    名称,印字区分,仕分区分,認識コード
    あいうえお,1,10,123456789012
    かきくけこ,3,6,987654321012
    
[/code]

**csv_convert.py (実行コード)**

[code]

    # coding: utf-8
    import csv
    
    inptfile = open("input.csv","r" , newline="")
    outptfile = open("output.csv","w" , newline="")
    
    outptfile.write("差出名称,内部印字区分,外部仕分区分\n")
    
    inptfile.readline()
    lines = inptfile.readlines()
    
    for line in lines:
        line = line.replace("\n","")
        line = line.split(",")
    
        row = ["{},{},{}\n".format(
            line[0],
            line[1],
            line[2]
            )]
        outptfile.write(row)
    
    inptfile.close()
    outptfile.close()
    
[/code]


CC BY-SA 4.0
2020-06-23T03:49:44.823
67910
2020-06-24T15:51:57.133
2020-06-24T15:51:57.133
3060
40769
question
python csv
CSV を出力しようとすると TypeError: write() argument must be str エラーが発生する


ご明察の通り、エラーは「writeメソッドの引数は文字列型のみ受け付けています。リスト型はダメです」という内容です。  
なので例えば[`str.join`](https://docs.python.org/ja/3/library/stdtypes.html#str.join)を使って、リスト型`row`に入っている要素を連結することで解決できます。

変更前: `outptfile.write(row)`  
変更後: `outptfile.write("".join(row))`

これだけでご所望の結果は取り出せると思います。

この他に[csvモジュール](https://docs.python.org/ja/3/library/csv.html)を使って頑張る方法もあります。

[code]

    # coding: utf-8
    import csv
    
    with open("input.csv", "r", newline="") as inptfile, open("output.csv","w" , newline="") as outptfile:
        reader = csv.DictReader(inptfile)
    
        write_fields = ["差出名称", "内部印字区分", "外部仕分区分"]
        writer = csv.DictWriter(outptfile, fieldnames=write_fields)
        writer.writeheader()
        for row in reader:
            writer.writerow({"差出名称": row["名称"] ,"内部印字区分": row["印字区分"], "外部仕分区分": row["仕分区分"]})
    
[/code]

もしPandasとDataframeをインストールして使うことができるならばさらに簡略化できます。  
(インストール方法は別途検索してください)

[code]

    # coding: utf-8
    import pandas as pd
    
    df = pd.read_csv("input.csv", encoding = "shift-jis")
    df = df.drop("認識コード", axis=1)
    df = df.rename(columns={"名称": "差出名称", "印字区分": "内部印字区分", "仕分区分": "外部仕分区分"})
    df.to_csv("output.csv", index=False, encoding = "shift-jis")
    
[/code]


CC BY-SA 4.0
2020-06-23T06:43:24.683
67919
2020-06-23T06:43:24.683
9820
67910
answer