首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打开文件缩进的if语句。

打开文件缩进的if语句。
EN

Stack Overflow用户
提问于 2022-09-06 16:47:19
回答 2查看 44关注 0票数 0

亲爱的社区我有一个问题,虽然这似乎不是什么大事,但它夺走了我的睡眠。我不需要睡觉,我需要答案!

我想打开一个文件,如果字符串“修改”在文件的内容中,我想打印(‘已经修改’),然后在这里打印文件的内容是我的代码:

代码语言:javascript
复制
with open(f"contents\\docs.txt", "r") as f:
    if "MODIFIED" in f.readlines():
        print("already modified")
    
    print(f.readlines())
    print()

这似乎是可以的,但奇怪的是,文件不包含字符串“修改”,所以它只需要正常打印文件的内容,但只返回一个空的列表[]!(文件不是空的!)如果我在没有if语句的情况下运行它,它通常会以它应该返回的方式返回内容。

代码语言:javascript
复制
with open(f"contents\\docs.txt", "r") as f:
    #if "MODIFIED" in f.readlines():
        #print("already modified")
    
    print(f.readlines())
    print()

我只是不明白,if语句会对代码返回空列表的代码做什么。

  • --我想返回的doc.txt文件--内容

代码语言:javascript
复制
before the flood
david attenborough: a life on our planet
an inconvenient truth
home 2009
kiss the ground 2020
seaspiracy 2020
cosmos

这是我第一次遇到这种情况,我该怎么称呼它呢,小虫?

如果你们能帮我找出出了什么问题,我会很感激

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-06 16:49:32

当您从一个文件中读取时,它会保存您停止的位置。readlines读取整个文件,所以当您再次调用readlines时,就没有什么可读的了。将其存储在一个变量中:

代码语言:javascript
复制
with open(f"contents\\docs.txt", "r") as f:
    lines = f.readlines()
    if "MODIFIED" in lines:
        print("already modified")
    print(lines)

注意:除非您在每一行的末尾去掉尾随的'\n's,否则仍然无法工作。另一种方法是通过一个lines加入\n,这样就可以得到一个字符串,而不是一个列表。

代码语言:javascript
复制
with open(f"contents\\docs.txt", "r") as f:
    lines = f.readlines()
    if "MODIFIED" in '\n'.join(lines):
        print("already modified")
    print(lines)

然而,这不是一个好做法,因此这是另一种选择:

代码语言:javascript
复制
with open(f"contents\\docs.txt", "r") as f:
    lines = f.read().splitlines()
    if "MODIFIED" in lines:
        print("already modified")
    print(lines)

splitlines没有尾随的\n

票数 2
EN

Stack Overflow用户

发布于 2022-09-06 17:04:15

"MODIFIED" in f.readlines()将始终计算为False,因为"MODIFIED"string,而f.readlines()strlist。因此,它将将"MODIFIED"与该list的每个元素进行比较。正如This Answer readlines所指出的,它还会为每一行添加尾随\n,因此即使您的文件包含MODIFIED,它实际上也会被读取为MODIFIED\n,从而使计算结果转到False。但是,正如Aran在评论中指出的那样,如果文件中的最后一行是True,并且在文件末尾没有newline,则计算结果可以变成newline

如果将字符串与另一个字符串进行比较,尾随\n不会影响您的比较,因为in检查的是in,而不是等式,=就是这样做的。因此,"MODIFIED" in "IAMAMODIFIEDSTRING"就是True

正确的做法是将其替换为in f.read(),它使解决方案如下:

代码语言:javascript
复制
with open(f"contents\\docs.txt", "r") as f:
    data = f.read()
    if "MODIFIED" in data:
        print("already modified")
    
    print(data)
    print()

但是,如果您想确保MODIFIED是独立的,那么您可以这样做:

代码语言:javascript
复制
with open(f"contents\\docs.txt", "r") as f:
    data = f.readlines()
    if "MODIFIED" in [line.strip() for line in data]:
        print("already modified")
    
    print('\n'.join(data))
    print()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73625360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档