次の内容のファイルがあります。
a
b
c
d
私は次のコードを使用してPythonでこれを読んでいます:
f = open('foo.txt')
w = f.readline()
while w is not '' :
print w
w = f.readline()
ドキュメントによると
f.readline()が空の文字列を返す場合、ファイルの終わりに達しています
では、なぜ無限ループに入るのですか?
オペレーターは、2つのis
参照がまったく同じオブジェクトを参照しているかどうかをテストします。この場合、あなたが指摘したように、同等性チェックが必要です。
無限ループが発生したのは、が返されたものの''
、の別のインスタンスであったためですstr
。インスタンスは異なりますが、値は同じです。
Pythonは、既存のstr
オブジェクトを再利用するための最適化として選択する場合と選択しない場合があります(結局のところ、それらは不変です)。ただし、ドキュメントで特に明記されていない限り、このタイプの動作に一般的に依存するべきではありません(None
たとえば、の唯一のインスタンスであるためNoneType
)。
これは面白い。
交換する場合
wが''である間
と
w!=''
コードは正常に実行されます。
これは、readline()が、実行時に取得するグローバルインスタンスを返すのではなく、空の文字列の新しいインスタンスを返すことを意味します。
s = ''
t = ''
assert s is t
これを試して
f = open('foo.txt')
while 1:
line = f.readline()
if not line:
break
print line
with open('workfile', 'r') as f:
read_data = f.read()
f.closed
It is good practice to use the with keyword when dealing with file objects. This has the advantage that the file is properly closed after its suite finishes, even if an exception is raised on the way. It is also much shorter than writing equivalent try-finally blocks.
Refer to this link: http://docs.python.org/2/tutorial/inputoutput.html