1. ホーム
  2. python

[解決済み] TypeError: 引数1には "書き込み "メソッドが必要です。

2022-02-09 05:19:07

質問

APIからデータを取得し、そのデータをcsvに入力することが問題です。データを取得することはできますが、データをcsvに出力するところでエラーが発生しています。誰か助けてください。

以下はサンプルコードです。

import csv,sys  
def read_campaign_info(campaigns):
   myfile = csv.writer(open("output.csv", "w")) 
   for insight in reach_insights:
            account_id = str(insight[AdsInsights.Field.account_id])
            objective = str(insight[AdsInsights.Field.objective])
            metrics =[account_id,objective]
            wr = csv.writer(myfile,quoting=csv.QUOTE_ALL)
            wr.writerows(metrics)

変数の種類 metrics<class 'list'>

表示されるエラーは

wr = csv.writer(myfile,quoting=csv.QUOTE_ALL)
TypeError: argument 1 must have a "write" method

解決方法は?

を渡しています。 csv.writer() オブジェクトを csv.writer() :

myfile = csv.writer(open("output.csv", "w")) 
wr = csv.writer(myfile,quoting=csv.QUOTE_ALL)

myfilecsv.writer() オブジェクト すでに . 代わりにそこに行を渡すか、あるいは csv.writer() の呼び出しは myfile の行に移動します(ただし、その後に wr = csv.writer(..) の行をループの外に出すことで、一度だけ作成する必要があります)。

適切に閉じられるように、ファイルオブジェクトをコンテキストマネージャとして使用することを強くお勧めします。また、改行処理はCSVモジュールに任せたいので、その場合は newline='' ファイルを開くときに

with open("output.csv", "w", newline='') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    for insight in reach_insights:
        account_id = insight[AdsInsights.Field.account_id]
        objective = insight[AdsInsights.Field.objective]
        wr.writerow([account_id, objective])

csv.writer() オブジェクトは文字列への変換を行うので str() の呼び出しは冗長です。