参数1必须是迭代器 - 我做错了什么?

6

我在一个项目中有一段代码,应该读取CSV文件并将每一行写入XLSX文件。现在当我通过命令行运行时,出现错误"argument 1 must be an iterator"。

这里是相关的代码:

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)时,你已经关闭了文件。第二步的目的是什么? - mechanical_meat
下面几行代码在继续之前从CSV文件中获取了一些变量。接下来是gcount = sum(1 for row in csv_read)这一行,我在后面处理xlsx文件中的数据时会用到它。 - DJGrandpaJ
好的,你可以使用另一个 with 语句再次打开文件。 - mechanical_meat
只做这个会更好吗: csvfile = open("testdata.csv", "r"),然后在那里完成所有操作,最后再执行 csvfile.close()?听起来你是这个意思,如果我将需要的内容存储在变量中,即使文件关闭了,我也可以随时获取它们,对吗? - DJGrandpaJ
是的,你可以这样做。将所需内容存储在变量中是一个好主意,这样你就不必两次迭代文件了。 - mechanical_meat
1个回答

6

当你到达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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接