2012-05-02 17 views
2

私の質問は、一度に1文字ずつファイルを反復処理するための他の方法があった場合ですか?Pythonでファイルから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に何が入りますか?誰にも助けてくれてありがとう。これについて

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

または何:

+0

この方法で何が問題になっていますか? – Keith

+0

はい、 "複製"コードですが、それは同じ質問ではありません。あなたが実際に他の質問を読むのが面倒だったら、彼は答えを得ましたが、私が試みているような他の方法を知りたいのです。どうもありがとうございます... – Andy

答えて

7

これは、1つの方法ですか?

ここ
with open(filename) as f: 
    for c in f.read(): 
     pass 
+2

+1。最初の解決策は、後者が非常に大きなファイル(メモリ不足)で問題を引き起こす可能性があるため、一般的に優れています。 –

+0

ああ、私はあなたがPythonのforループ(第2コード)でそれを行うことができるとは思わなかった。ありがとう。 – Andy

+1

@Lattyware:ファイルには非常に長い行が含まれている可能性があるため、最初は同じです:P – orlp

3

は、ファイルオブジェクトの他のメソッドです:

'閉じる'、 'FILENO'、 'フラッシュ'、 'isatty'、 '改行'、 '次へ'、 '読み取り'、 'readinto'、 'のreadline'、 'readlines'、 、 'TRUNCATE'、 は '伝える'、 'なsoftspace'、 '求める' '書き込み'、 'writelines'、 'xreadlines'

あなたはdocumentationで読むことができます。

変数cは、それ以上読む必要がない場合は空の文字列になります。 Falseと評価されるので、if not cというテストはTrueです。これはあなたがファイルの最後にいることを示します。

+0

ここに@nightcrackerという質問があります。また、この例では、ファイルの最後に到達したときに変数cに何が含まれていましたか? ' – Keith

+0

十分に、それは質問に答えます。 – orlp

+0

入力いただきありがとうございます! – Andy

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は、それが使い果たされるまで、与えられた反復可能で最初イテラブルから要素を返し反復可能で、その後、イテレート可能オブジェクトの全てまで、次の反復可能に移行させます疲れた。通常、これはリストのリストを平坦化するために使用されますが、この場合、その行を無視することができます。

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

+0

しかし、iterableを連鎖するのはあまり意味がありません。この場合、ファイルオブジェクト自体を使用してください。 – Keith

+1

@Keithです。彼らは文字を求めていたので、ファイルは繰り返し可能な文字列である行の繰り返し可能なものです。これは線の繰り返しが可能で、文字の繰り返しが可能です。 –

+0

キース:iterableを超える反復処理が行われると、ファイルオブジェクトは反復可能であると見なすことができます。 – orlp

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と同じように動作します。ファイル内に読み込む文字がなくなると、それは中断されます。

関連する問題