【问题标题】:I/O operation on closed csv file对关闭的 csv 文件的 I/O 操作
【发布时间】:2015-10-13 11:20:36
【问题描述】:

我在.csv 文件中有一些信息。我希望能够检查文件里面是否有特定的代码。

下面是我的代码:

import csv
with open('bezoekerscode.csv', 'r') as f:
    reader = csv.reader(f)


def code_control():
    code = str(input('Type hier uw code in die u wilt controleren:\n'))
    if code in reader:
        print('code komt overheen, en wordt nu gecheckt of de aanbieder wel correct is.')
        f.close()
    else:
        print('deze code komt niet overheen.')
        f.close()

code_control()

结果应该是:

  • 代码匹配

  • 代码不匹配

【问题讨论】:

  • 这里有两个问题:首先,您错误地使用了with,这将在上下文末尾关闭f,使csv.reader 没有有效的输入文件。其次,您错误地使用了csv.reader,它会给您rows 个项目,而不是直接提供项目;您必须检查code 是否在任何行中,否则检查它是否等于 到任何行。

标签: python csv io


【解决方案1】:

您可以利用 Python 中的空列表 []if 子句中被评估为 False 的事实:

if [line for line in reader.readlines() if code in line.strip()]:
    # if code doesn't match a line, it will return [] ergo false
    # and else is going to get executed.
else: 
    # Do else stuff.

您通常也希望将您的 with open 语句移动到函数中。 with 之后会自动关闭你的文件。您的代码看起来像这样会更好:

import csv

def code_control():
    with open('bezoekerscode.csv', 'r') as f:
         reader = csv.reader(f)
         code = str(input('Type hier uw code in die u wilt controleren:\n'))
        if [line for line in reader.readlines() if code in line.strip()]::
            print('code komt overheen, en wordt nu gecheckt of de aanbieder wel correct is.')
    else:
        print('deze code komt niet overheen.')

code_control()

请注意,您不能对已关闭的文件执行操作。要评估文件是否仍然打开,您可以检查其file.closed 属性。

【讨论】:

    【解决方案2】:

    您的代码的问题是您在该 code_control 函数中使用了 reader 变量,但该变量在 context 中是本地的>。

    您可以全局声明它,也可以将其作为参数发送给 code_control 函数:

    import csv
    
    def code_control(reader):
        code = str(input('Type hier uw code in die u wilt controleren:\n'))
        if code in reader:
            print('code komt overheen, en wordt nu gecheckt of de aanbieder wel correct is.')
        else:
            print('deze code komt niet overheen.')
    
    with open('bezoekerscode.csv', 'r') as f:
       reader = csv.reader(f)
       code_control(reader)
    

    你也不需要 f.close() 因为你通过 with 使用的上下文管理器已经处理了。

    【讨论】:

    • 谢谢,这成功了!但是,我们有一个 .csv 文件,其中包含一些代码信息。其中一个单元格有一个代码(例如“A44”)。当我在 reader: 中尝试 "if "a44" 时,它说找不到代码。
    • reader 不是上下文的本地 - 上下文没有自己的范围。但是,上下文将在其末尾关闭 f,这会破坏阅读器(因为它需要一个 open 文件)。
    • 感谢@MisterMiyagi,我不知道上下文没有自己的范围。在这种情况下,它表现为一个局部变量,所以我认为它是,但似乎我必须做更多的阅读。
    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2022-01-21
    • 2016-07-21
    相关资源
    最近更新 更多