【问题标题】:Argument 1 must be an iterator - what am I doing wrong?参数 1 必须是迭代器 - 我做错了什么?
【发布时间】:2023-04-07 14:02:02
【问题描述】:

我的项目中有一段代码应该读取 CSV 文件并将每一行写入 XLSX 文件。现在我通过命令行运行时收到错误“参数 1 必须是迭代器”。

以下是相关代码:

import os
import openpyxl
import csv
from datetime import datetime
from openpyxl.reader.excel import load_workbook

...

plannum = 4

...

alldata_sheetname = ("All Test Data " + str(plannum))
wb = load_workbook("testingtemplate.xlsx", keep_vba=True)

...

ws_testdata = wb.get_sheet_by_name(alldata_sheetname)

...

with open("testdata.csv", 'r') as csvfile:
    table = csv.reader(csvfile)
    for row in table:
        ws_testdata.append(row)

csv_read = csv.reader(csvfile)

...

具体错误为:“TypeError: argument 1 must be an iterator”,并且引用了我提供的最后一行代码。

既然它没有抱怨我第一次使用csvfile,如果我做类似csvfile = open("testdata.csv", "r")而不是使用with会更好(这就是我在这里做错了) ?如果是这样,我还有什么需要改变的吗?

感谢所有帮助的人!

【问题讨论】:

  • 当您到达csv_read = csv.reader(csvfile) 时,您已经关闭了文件。第二步是什么意思?
  • 接下来的几行代码在继续之前从 CSV 中获取一些变量。 gcount = sum(1 for row in csv_read) 是下一行,稍后在我处理 xlsx 文件中的数据时使用。
  • 好的,那么您可以使用另一个with 语句再次打开文件。
  • 最好只做:csvfile = open("testdata.csv", "r"),然后在那里做所有事情,然后做csvfile.close()?听起来这就是你的意思,如果我将我需要的内容存储在变量中,即使文件关闭,我也可以稍后获取它们,对吧?
  • 是的,你可以这样做。并且将您需要的内容存储在变量中是一个好主意,这样您就不必对文件进行两次迭代。

标签: python csv iterator


【解决方案1】:

当您到达csv_read = csv.reader(csvfile) 时,您已经关闭了文件。或者,您可以保持文件打开并将所需的内容存储在变量中,这样您就不必对文件进行两次迭代。例如:

csvfile = open("testdata.csv", "r")
table = csv.reader(csvfile)
for row in table:
    ws_testdata.append(row)
    # store what you need in variables
csvfile.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 2014-08-06
    • 1970-01-01
    相关资源
    最近更新 更多