【问题标题】:TypeError: argument 1 must have a "write" methodTypeError:参数 1 必须有一个“写”方法
【发布时间】:2017-03-03 09:19:04
【问题描述】:

我手头的问题是从 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

【问题讨论】:

    标签: python python-3.x csv


    【解决方案1】:

    您正在将csv.writer() 对象传递给csv.writer()

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

    myfile 是一个csv.writer() 对象已经。将您的行传递给该行,或从myfile 行中删除csv.writer() 调用(但然后将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() 调用是多余的。

    【讨论】:

    • 感谢您的评论。我将代码修改为 'wr = csv.writer(metrics,quoting=csv.QUOTE_ALL)',但仍然有相同的错误。你能展示如何修改我的代码吗?对不起,我是python的菜鸟
    • @user4943236: metrics 是您的行,而不是文件对象。你已经创建了一个csv.writer(),你不需要在循环中继续创建一个。
    • 谢谢,我修改了我的代码以执行以下`myfile.writerows(metrics)`,现在这是我得到的错误,知道如何解决这个>错误:预期可迭代,不浮动
    • @user4943236:您是否尝试修改代码以遵循我的答案中的示例?您现在似乎根本没有 csv.writer() 对象。
    • @user4943236:啊,我错过了你使用的csv.writer.writerows()(复数),应该是csv.writer.writerow()(单数,最后没有s)。已更正。
    猜你喜欢
    • 2017-09-21
    • 2017-05-13
    • 2015-09-25
    • 2016-02-20
    • 2010-09-23
    • 2021-10-12
    • 1970-01-01
    • 2012-12-12
    • 2018-08-11
    相关资源
    最近更新 更多