我有一部分原本无法工作的代码,看起来是这样的:
1
2
3
4
5
6with open ("Names.txt" ,"r+") as f:
f.seek(0)
if f.read() =="" :
print("No text")
else :
print ("Got text")
它应该做的是检查文本文件是否有任何文本。然而,当我运行这个代码时,它总是返回"got text",即使文件是空的。在尝试修复它大约10分钟后,我稍微更改了代码,并找到了一种方法使其工作:
1
2
3
4
5
6with open ("Names.txt" ,"r+") as f:
f.seek(0)
if not f.read():
print("No text")
else :
print ("Got text")
所以我的问题是,为什么第二段代码有效,而第一段代码无效?
提前感谢<3
if f.read() ==""检查空间,而不是空字符串。你知道吗?
"A space"不等于"empty"。
不要读取文件来查看它是否为空…只需检查尺寸:与EDOCX1[1]
只是不要测试这样的文件是否为空。
如果文件大5兆字节怎么办?它将尝试读取所有文件…
您可以尝试读取1个字节,并查看是否为空:
1
2
3
4if f.read(1):
# file isn't empty
else:
# file is empty
或者只是检查尺寸,不需要打开,寻找,无论什么:
1
2
3
4if os.path.getsize(filename):
# file isn't empty
else:
# file is empty
您正在与字符串""进行比较。这不是空文件。正确的代码如下:
1
2
3
4
5
6with open ("Test.txt" ,"r+") as f:
f.seek(0)
if f.read() =="" :
print("No text")
else :
print ("Got text")
也许,因为在第一种情况下,您不将其与空字符串(""进行比较,而是将其与包含单个空格(""的字符串进行比较。
在第一种情况下,将结果与""进行比较(注意引号之间的空格)。这个空间不等于一个空文件,而是寻找一个长度正好为1的文件,其中单个字符就是空间字符。
而第二个代码片段则有效地检查文件的长度是否为0,这正是您实际要做的(因此它起作用的原因)。
要修复第一个代码片段,需要将其与空字符串f.read() ==""进行比较。您还可以显式地检查文件长度:len(f.read()) == 0或not len(f.read()),或者您也可以检查文件长度而不读取它。