For循环未完全迭代csv文件

2024-09-27 18:03:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为我的程序重构一些代码,但在这个过程中我有一个错误。我正在读写.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循环之外,其他所有代码都是相同的,下面是它以前的样子:

what it used to look like

编辑:所以我认为这可能是一个变量实例错误,所以我尝试重命名我的变量,而不是重用它们,问题仍然存在。现在要尝试一个新的文件实例

编辑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)

Tags: 文件csvin编辑forwithrowprint
1条回答
网友
1楼 · 发布于 2024-09-27 18:03:31

如果您仔细阅读文档,它会说csv阅读器只是一个解析器,所有繁重的工作都是由底层文件对象完成的。
在您的情况下,您正试图在第二次迭代中读取一个已关闭的文件,这就是它无法工作的原因。
要使csv阅读器正常工作,您需要一个支持迭代器协议的底层对象,并且每次调用其next()方法时都返回一个字符串-文件对象和列表对象都是合适的

链接到文档:https://docs.python.org/3/library/csv.html

相关问题 更多 >

    热门问题