【发布时间】: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()?听起来这就是你的意思,如果我将我需要的内容存储在变量中,即使文件关闭,我也可以稍后获取它们,对吧? -
是的,你可以这样做。并且将您需要的内容存储在变量中是一个好主意,这样您就不必对文件进行两次迭代。