【问题标题】:AttributeError: __enter__ ; context manager inside function属性错误:__enter__;函数内部的上下文管理器
【发布时间】:2021-05-23 15:01:36
【问题描述】:
def get_reply(file_name, input): 
    import csv
    #error line
    with open(file_name, "r") as csv_f, csv.reader(csv_f, delimiter = ",") as csv_reader:  
        return search(csv_reader, input)

错误:

in get_reply
     with open(file_name, "r") as csv_f, csv.reader(csv_f, delimiter = ",") as csv_reader:
   AttributeError: __enter__

为什么会出现此错误以及如何解决?在这种情况下,这个错误是什么意思?

非常感谢您的帮助,我是编程新手..

我将附上其余代码,用于上下文,旨在通过遍历 csv 文件 [user_input,response] 来处理对用户输入的回复。

代码以这种方式编写以便可以导入和重用

def search(csv_reader, input) :
    for line in csv_reader:
        if input == line[0]:
            return line[1]

def get_reply(file_name, input): 
    import csv
    with open(file_name, "r") as csv_f, csv.reader(csv_f, delimiter = ",") as csv_reader:
        return search(csv_reader, input)

        
#Test execution                      
list1 = get_reply("csv_dataset.txt", input("Enter Input : "))  

【问题讨论】:

标签: python function file-handling attributeerror contextmanager


【解决方案1】:

csv.reader 没有实现__enter____exit__ 方法。所以你不能将它用作上下文管理器(这就是你对with 所做的)。

这样使用:

def get_reply(file_name, input): 
    import csv
    with open(file_name, "r") as csv_f:
        csv_reader = csv.reader(csv_f, delimiter = ",")
        return search(csv_reader, input)

如果您想将其用作上下文管理器,您可以使用contextlib 构建自己的包装器。

import csv
from contextlib import contextmanager


@contextmanager
def csv_reader(*args, **kwargs):
    yield csv.reader(*args, **kwargs)


with open(file_name, "r") as csv_f, csv_reader(csv_f, delimiter = ",") as reader:
    return search(reader, input)

【讨论】:

  • 没有理由让它成为上下文管理器,但是:csv.reader 只是使用一个打开的文件对象,并不负责确保它被关闭。在出现异常时,它也不会做任何需要清理的事情(正如您的定义所表明的那样:在产生 csv.reader 实例之前或之后您不做任何事情)。
猜你喜欢
  • 2017-01-29
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 2017-04-21
  • 2023-03-26
  • 2021-08-21
相关资源
最近更新 更多