为了账号安全,请及时绑定邮箱和手机立即绑定

with.. if else.. as 语句单行python

with.. if else.. as 语句单行python

繁星点点滴滴 2022-06-22 17:30:28
所以我遇到了一个问题。我试图打开一个文本文件并根据变量的值正常或反向逐行读取它。Python不断抛出AttributeError: __enter__错误;但我主要是想看看这是否可能。示例代码:def function(rev):    #    - open file in reverse format                        - open file normally    with reversed(list(open("test.txt"))) if rev == True else open("test.txt") as dict:        for line in dict:            print (line)            pass        pass    passfunction(True)结果:    ...    with reversed(list(open("test.txt"))) if rev == True else open("test.txt") as dict:AttributeError: __enter__我怎样才能做到这一点,而不必为同一过程的两种可能性和 2 个不同的 with-as 循环创建标准 if 语句?
查看完整描述

2 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

不要在with语句中这样做,您的表达式将生成两个不同的对象(列表或文件对象,列表没有上下文管理器接口,文件对象有,这就是引发错误的原因)


只需分两行,先打开:


def function(rev):

    with open("test.txt") as fp:

        data = reversed(list(fp)) if rev == True else fp:

        for line in data:

            print(line)

function(True)


查看完整回答
反对 回复 2022-06-22
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

Python 中的上下文管理器正在发生一些疯狂的事情。尝试改用简单的 for 语句和常规的 for 循环。


read_option.py

def my_function(rev):


    if rev == True:

        read_pattern = reversed(list(open("test.txt").readlines()))

    else:

        read_pattern = list(open("test.txt"))


    for line in read_pattern:

        print (line)


my_function(True)

如果你真的想要一个with语句,你可能需要__enter__在你自己的类中实现该方法。有关更多详细信息,请参阅此答案:Python 错误:AttributeError:__enter__


示例 test.txt

abcd

efgh

ijlk

输出

(py36) [~]$ python3 read_option.py

ijlk


efgh


abcd


查看完整回答
反对 回复 2022-06-22
  • 2 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信