在Python中读取文件进入无限循环

在Python中读取文件进入无限循环,python,Python,我有一个包含以下内容的文件: a b c d 我使用以下代码在Python中阅读这篇文章: f = open('foo.txt') w = f.readline() while w is not '' : print w w = f.readline() 根据 如果f.readline()返回空字符串,则表示已到达文件末尾 那么为什么我要进入无限循环?操作符测试两个引用是否引用了完全相同的对象。在本例中,如您所述,您需要进行相等性检查 发生无限循环是因为尽管它返回了',

我有一个包含以下内容的文件:

a  
b  
c  
d
我使用以下代码在Python中阅读这篇文章:

f = open('foo.txt')
w = f.readline()

while w is not '' :
  print w
  w = f.readline()
根据

如果f.readline()返回空字符串,则表示已到达文件末尾


那么为什么我要进入无限循环?

操作符测试两个引用是否引用了完全相同的对象。在本例中,如您所述,您需要进行相等性检查

发生无限循环是因为尽管它返回了
'
,但它是
str
的一个不同实例。不同的实例,但值相同


Python可能会也可能不会选择作为优化来恢复现有的
str
对象(毕竟它们是不可变的)。但是,一般情况下,您不应该依赖这种行为,除非文档中特别提到(例如,
None
,因为它是
NoneType
的唯一实例)。

如果两个引用引用引用了完全相同的对象,则
操作符测试。在本例中,如您所述,您需要进行相等性检查

发生无限循环是因为尽管它返回了
'
,但它是
str
的一个不同实例。不同的实例,但值相同

Python可能会也可能不会选择作为优化来恢复现有的
str
对象(毕竟它们是不可变的)。但是,一般情况下,您不应该依赖于这种行为,除非文档中特别提到其他行为(例如,
None
,因为它是
NoneType
的唯一实例)。

这很有趣

如果你更换

而w是“

而w!=''

代码将成功运行

这意味着readline()返回空字符串的新实例,而不是返回执行时得到的全局实例

s = ''
t = ''
assert s is t
这很有趣

如果你更换

而w是“

而w!=''

代码将成功运行

这意味着readline()返回空字符串的新实例,而不是返回执行时得到的全局实例

s = ''
t = ''
assert s is t
试试这个

f = open('foo.txt')

while 1:
    line = f.readline()
    if not line:
        break
    print line
试试这个

f = open('foo.txt')

while 1:
    line = f.readline()
    if not line:
        break
    print line
在处理文件对象时,最好使用with关键字。这样做的好处是,即使在执行过程中引发异常,文件也会在其套件完成后正确关闭。它也比编写等效的try-finally块短得多

请参阅此链接:

在处理文件对象时,最好使用with关键字。这样做的好处是,即使在执行过程中引发异常,文件也会在其套件完成后正确关闭。它也比编写等效的try-finally块短得多


请参阅此链接:

我解决了问题。将while条件更改为
w!=''使其工作正常。我仍然想知道为什么
不是
导致无限循环。我不会用那个代码进入无限循环。埃里克,这很有趣。我在Ubuntu 12.10/12.04和Python 2.7.3上运行了一个无限循环。我在两个不同的系统上尝试了这个方法,并且能够重现这个问题;我使用的是Windows7(Py2.7)。也许某些优化正在使它们成为同一个对象。当w不是“”时不要写
,只要在w:
时写
,我就解决了问题。将while条件更改为
w!=''使其工作正常。我仍然想知道为什么
不是
导致无限循环。我不会用那个代码进入无限循环。埃里克,这很有趣。我在Ubuntu 12.10/12.04和Python 2.7.3上运行了一个无限循环。我在两个不同的系统上尝试了这个方法,并且能够重现这个问题;我使用的是Windows7(Py2.7)。也许某些优化正在使它们成为同一个对象。当w不是“”时不要写
,当w: