3

Python では、プログラムの後半で fp にアクセスしようとすると、fp.readlines() がファイルを閉じているという証拠が見られます。この動作を確認できますか? ファイルから再度読み取りたい場合、後でファイルを再度開く必要がありますか?

ファイルは閉じていますか? 似ていますが、私の質問のすべてに答えたわけではありません。

import sys 

def lines(fp):
    print str(len(fp.readlines()))

def main():
    sent_file = open(sys.argv[1], "r")

    lines(sent_file)

    for line in sent_file:
        print line

これは次を返します:

20
4

4 に答える 4

10

ファイルを読み取ると、ファイル ポインタは末尾に移動され、そのポイントを超える行は「見つかりません」。

ファイルを再度開くか、先頭に戻ります。

sent_file.seek(0)

ファイルは閉じられていません。閉じたファイルにアクセスしようとすると、例外が発生します。

>>> fileobj = open('names.txt')
>>> fileobj.close()
>>> fileobj.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file
于 2013-05-12T14:17:32.743 に答える
3

ファイルを閉じませんが、ファイル内の行を読み取るため、ファイルを再度開くか、ファイルポインターをfp.seek(0).

ファイルを閉じない証拠として、実際にファイルを閉じるように関数を変更してみてください。

def lines(fp):
    print str(len(fp.readlines()))
    fp.close()

次のエラーが表示されます。

Traceback (most recent call last):
  File "test5.py", line 16, in <module>
    main()
  File "test5.py", line 12, in main
    for line in sent_file:
ValueError: I/O operation on closed file
于 2013-05-12T14:18:00.137 に答える
1

閉じませんが、ファイルは最後になります。その内容をもう一度読みたい場合は、使用を検討してください

f.seek(0)
于 2013-05-12T14:20:19.810 に答える
0

with ステートメントとコンテキスト マネージャーを使用することができます。

>>> with open('data.txt', 'w+') as my_file:     # This will allways ensure
...     my_file.write('TEST\n')                 # that the file is closed.
...     my_file.seek(0)
...     my_file.read()
...
'TEST'

通常の呼び出しを使用する場合は、手動で閉じることを忘れないでください (理論的には、Python はファイル オブジェクトを閉じ、必要に応じてそれらをガベージ コレクションします)。

>>> my_file = open('data.txt', 'w+')
>>> my_file.write('TEST\n')   # 'del my_file' should close it and garbage collect it
>>> my_file.seek(0)
>>> my_file.read()
'TEST'
>>> my_file.close()     # Makes shure to flush buffers to disk
于 2013-05-12T15:14:33.297 に答える