【问题标题】:Writing to CSV file. TypeError: writerows() argument must be iterable写入 CSV 文件。 TypeError:writerows() 参数必须是可迭代的
【发布时间】:2014-04-09 11:56:52
【问题描述】:

我正在尝试编写一个货币转换器,其中包含代码和一个 csv 文件,可以在其中编辑 csv 文件以保存使用之间的新汇率。但我在写入文件和更改速率时遇到问题:

 def change():
    print()
    print()
    print()
    print("1) Change existing exchange rate.")
    print("2) Add new exchange rates.")
    print("3) Quit.")
    exRtFile = open ('exchangeRate.csv')
    exchReader = csv.reader(exRtFile)
    exchWriter = csv.writer(exRtFile)
    loop2=0
    while loop2==0:
        selected=int(input("Please select an option: "))
        if selected == 1:
            change = input("What rate would you like to change: ")
            changeRt = float(input("What would you like to change the rate to: "))
            for row in exchReader:
                currency = row[0]
                if currency == change:
                    crntRt = row[1]
                    crntRt = changeRt
                    exchWriter.writerows(crntRt)

输入/输出示例:

1) Change existing exchange rate.
2) Add new exchange rates.
3) Quit.
Please select an option: 1
What rate would you like to change: Euro
What would you like to change the rate to: 1.23
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    converter()
  File "py", line 21, in converter
    change()
  File "py", line 91, in change
    exchWriter.writerows(crntRt)
TypeError: writerows() argument must be iterable

【问题讨论】:

  • 在不知道输入的情况下,很难调试它。你能提供一个工作的例子吗?但是这个错误是不言自明的:要么使用writerow(注意单数;你只想在循环中写一行,对吧?)或者将一个可迭代对象传递给writerows-方法。

标签: python file csv typeerror


【解决方案1】:

writeRows() 就其本质而言,期望一个变量保存一堆值,每个值都包含要写入输出文件中一行的数据。

因为你给 writerows() 一个单一的 float 值,它的响应是告诉你它不知道如何把它变成多行——在“Python speak”中,must be iterable 的意思是“我不能弄清楚如何从你给我的项目中获取多个值”。

您的代码中可能还有许多其他问题。特别是:

 crntRt = row[1]
 crntRt = changeRt
 exchWriter.writerows(crntRt)

让我觉得您希望在输出中看到 row[1] 的值,但您不会,因为下一行用新汇率覆盖了该值。

【讨论】:

  • 我正在尝试获取值的位置 (crntRt = row[1]),然后将其更改为新值 (crntRt = changeRt),然后将其写入文件 (exchWriter.writerows (crntRt))。有什么更好的方法来做到这一点?
  • 这不是一个完全清楚的问题陈述。您应该知道,您不能同时读取和写入同一个 CSV 文件—— csv 模块不会执行“就地”更新。您必须重写 整个 文件。因此,您的基本结构将是 1)将整个文件读入内存,将其存储在字典或类似文件中,2)从用户那里收集更新,将每个更新应用于内存结构,以及 3)当用户完成并想要保存更改,用 CSV 格式的整个内存结构覆盖磁盘文件。
  • 在某处有这样的例子吗?
猜你喜欢
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
相关资源
最近更新 更多