2

私の質問は、一度に1文字ずつファイルを反復処理するために、以下以外に他の方法があったかどうかです?

with open(filename) as f:
  while True:
    c = f.read(1)
    if not c:
      print "End of file"
      break
    print "Read a character:", c

Javaのように読み物があるかどうかをチェックする機能がないので、他にどのような方法がありますか。また、この例では、変数 c がファイルの最後に達したとき、変数 c には何が入っているでしょうか? 誰の助けにも感謝します。

4

4 に答える 4

8

別のオプションは、次を使用することitertools.chain.from_iterable()です。

import itertools

with open("test.txt") as f:
    for c in itertools.chain.from_iterable(f):
        print(c)

chain.from_iterable指定された iterable の最初の iterable から要素がなくなるまで返す iterable を作成し、すべての iterable が使い果たされるまで次の iterable に進みます。通常、これはリストのリストを平坦化するために使用されますが、この場合、行を無視できます。

これが実際にネストされたループよりも優れているかどうかは別の問題です (少し速くなりますが、問題になる可能性はほとんどありません) が、言及する価値はあります。

于 2012-05-02T23:06:34.283 に答える
7

これは 1 つの方法です。

with open(filename) as f:
    for line in f:
        for c in line:
            pass

それともこれはどうですか?

with open(filename) as f:
    for c in f.read():
        pass
于 2012-05-02T22:59:07.810 に答える
3

ファイルオブジェクトの他のメソッドは次のとおりです。

'close', 'fileno', 'flush', 'isatty', 'newlines', 'next', 'read', 'readinto', 'readline', 'readlines', 'seek', 'softspace', 'tell '、'truncate'、'write'、'writelines'、'xreadlines'

ドキュメントで読むことができます。

c読み取るものが何もない場合、変数は空の文字列になります。False と評価されるため、テストif not cは True です。これは、ファイルの最後にいることを示しています。

于 2012-05-02T23:06:17.247 に答える
2

別の方法は、ジェネレーターを使用することです。

def blocks(infile, bufsize=1024):
    while True:
        try:
            data=infile.read(bufsize)
            if data:
                yield data
            else:
                break
        except IOError as (errno, strerror):
            print "I/O error({0}): {1}".format(errno, strerror)
            break

f=open('somefile.txt','rb')

for c in blocks(f,1):
    print c

ジェネレーターを使用すると、ファイル全体がメモリに保持されず、基盤となる OS が通常、ディスク読み取りの適切なバッファリングを実行します。

ジェネレーターとして、他の iterable と同じように機能します。ファイルに読み取る文字がなくなると壊れます。

于 2012-05-03T02:00:07.383 に答える