对关闭的 csv 文件 ValueError 的操作,Python 代码

Posted

技术标签:

【中文标题】对关闭的 csv 文件 ValueError 的操作,Python 代码【英文标题】:operation on closed csv file ValueError, Python Code 【发布时间】:2018-05-15 04:13:18 【问题描述】:

我目前正在编写一个脚本来读取 CSV 文件中的两列浮点数并找到每列的平均值。我不明白为什么我的代码在关闭文件上给我一个 ValueError I/O 操作。

我的代码有两个打开的语句,因为据我了解,您必须关闭文件并重新打开它,然后才能将平均值添加到第二列并找到平均值。

我的代码如下,感谢我能得到的任何反馈,这对我来说没有意义。谢谢你。

语言:Python 3.6

def main():
    import csv

    file = input("What is the name of the file, dont forget the .csv: ")
    INFILE = open(file,"r")
    totalCol1 = 0
    countCol1 = 0
    totalCol2 = 0
    countCol2 = 0
    read = csv.reader(INFILE,lineterminator=",")

    # Loop through column 1
    for row in read:
        totalCol1 += float(row[0])
        countCol1 += 1
    averageCol1 = totalCol1 / countCol1
    INFILE.close()

    INFILE = open(file,"r")
    for row in read:
        totalCol2 += float(row[1])
        countCol2 += 1
    averageCol2 = totalCol2 / countCol2

    print('Average for Column One:%5.2f' % averageCol1)
    print('Average for Column Two:%5.2f' % averageCol2)
    INFILE.close()

main()

【问题讨论】:

您不需要关闭文件并重新打开它。您可以在一个循环中访问所有列 谢谢@jdigital 我不知道我从哪里得到需要两个循环的想法。感谢您的帮助 【参考方案1】:

我怀疑发生的事情是您将 INFILE 的一个实例传递给 csv.reader 然后关闭。因此,当您再次打开文件时,您需要将该新实例传递给 csv.reader。

话虽如此,您可以在第一个循环中完成所有这些操作,而无需关闭并重新打开文件:

for row in read:
    totalCol1 += float(row[0])
    countCol1 += 1

    totalCol2 += float(row[1])
    countCol2 += 1

averageCol1 = totalCol1 / countCol1
averageCol2 = totalCol2 / countCol2

或者您可以使用 pandas read_csv 读取 csv,然后使用 pandas mean 计算平均值并避免循环(在 Python 中值得尝试)。

【讨论】:

完美,谢谢,我不确定我从哪里得到我需要两个循环的想法......这绝对是我的错。感谢您的帮助

以上是关于对关闭的 csv 文件 ValueError 的操作,Python 代码的主要内容,如果未能解决你的问题,请参考以下文章

ValueError : 对已关闭文件的 I/O 操作

在 Azure Synapse 笔记本 ValueError 中运行 nltk.download:对关闭的文件进行 I/O 操作

数字后带有减号的 CSV 文件。 “ValueError:无法将字符串转换为浮点数:”

无法纠正 - ValueError: unknown url type: Link

获取 ValueError:在尝试将匹配的文件名从 csv 复制到另一个目录时,没有足够的值来解压(预期为 2,得到 1)

Numpy加载CSV - ValueError:无法将字符串转换为float