我正在为我的程序重构一些代码,但在这个过程中我有一个错误。我正在读写.csv文件
在我的程序开始时,我迭代了一个.csv文件,以便从文件中找到我需要的数据
with open(csvPath, mode='r') as inputFile:
csvReader = csv.reader(inputFile)
potentialVals = []
paramVals = {}
for row in csvReader:
if row[3] == "Parameter":
continue
# Increment vales in dict
if row[3] not in paramVals:
paramVals[row[3]] = 1
else:
paramVals[row[3]] += 1
这会迭代并正常工作,for
循环获取.csv文件中的每一行。我让他们执行一些计算,稍后再次遍历同一个.csv文件,然后选择数据写入新的.csv文件。我的问题是,当我第二次迭代时,它只给出了.csv文件的第一行,没有其他内容
# Write all of the information to our new csv file
with open(outputPath, mode='w') as outputFile:
csvWriter = csv.writer(outputFile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
inputFile.seek(0)
rowNum = 0
for row in csvReader:
print(row)
在print语句所在的位置,它只打印.csv文件的第一行,然后退出for循环。我真的不确定是什么原因造成的。我想可能是因为
inputFile.seek(0)
但即使我打开了第二个阅读器,问题依然存在。这个for
循环在我重构它之前是有效的,除了我遇到问题的for
循环之外,其他所有代码都是相同的,下面是它以前的样子:
编辑:所以我认为这可能是一个变量实例错误,所以我尝试重命名我的变量,而不是重用它们,问题仍然存在。现在要尝试一个新的文件实例
编辑2:好的,这很有趣,当我查看我的reader对象的line_num值时(当我打开一个新对象而不是使用.seek时),它会输出1,所以我在文件的开头。当我查看len(list(csvReader))
时,它是229703,这表明.csv已经完全存在了,所以仍然不确定为什么它除了.csv的第一行之外什么都不做
编辑3:就像一次万岁的尝试一样,我尝试创建一个.csv文件的深度副本,并对其进行迭代,但结果相同。我还试着只做一个完整的单独的.csv文件,我也得到了同样的问题,只有一行。我想这消除了文件问题,信息在那里,但有一些东西阻止它读取
编辑4:这是我目前处理同一问题的地方。我可能不得不完全重写这个方法,哈哈,但我要去吃午饭,所以我现在无法积极回应。谢谢你迄今为止的帮助
# TODO: BUG HERE
with open(csvPath, mode='r') as inputFile2:
csvReader2 = csv.reader(inputFile2)
...
for row2 in csvReader2:
print("CSV Line Num: " + str(csvReader2.line_num))
print("CSV Index: " + str(rowNum))
print("CSV Length: " + str(len(list(csvReader2))))
print("CSV Row: " + str(row2))
此外,如果有帮助,这里是csvPath:
nameOfInput = input("Please enter the file you'd like to convert: ")
csvPath = os.path.dirname(os.path.realpath(nameOfInput))
csvPath = os.path.join(csvPath, nameOfInput)
如果您仔细阅读文档,它会说csv阅读器只是一个解析器,所有繁重的工作都是由底层文件对象完成的。
在您的情况下,您正试图在第二次迭代中读取一个已关闭的文件,这就是它无法工作的原因。
要使csv阅读器正常工作,您需要一个支持迭代器协议的底层对象,并且每次调用其next()方法时都返回一个字符串-文件对象和列表对象都是合适的
链接到文档:https://docs.python.org/3/library/csv.html
相关问题 更多 >
编程相关推荐