0

各ディレクトリに複数のディレクトリと多くのファイルがあり、それぞれを繰り返し処理したいと考えています。また、各ファイルの行のみを読み取りたいため5th、最初の 4 行は無視します。4最初の行を無視しようとせずにスクリプトを実行すると、問題なく実行されます。コードは次のとおりです。

import os

#find the present working directory
pwd=os.path.dirname(os.path.abspath(__file__))

#find all the folders in the present working directory.
dirs = [f for f in os.listdir('.') if os.path.isdir(f)]

for directory in dirs:
        os.chdir(os.path.join(pwd, directory));
        chd_dir = os.path.dirname(os.path.abspath(__file__))
        files = [ fl for fl in os.listdir('.') if os.path.isfile(fl) ]
        print files
        for f in files:
                f_obj = open(os.path.join(chd_dir, f), 'r')
                for i in xrange(0,4): #ignore the first 4 lines
                        f_obj.next()
                s=f_obj.readline()
                print s
                f_obj.close()

このスクリプトでは、次のエラーが発生します。 ValueError: Mixing iteration and read methods would lose data

Python が一部のデータを失うと考える理由がわかりません。また、それを修正する回避策と、なぜそれを修正するのかを知りたいです。

4

1 に答える 1

2

.next()次の方法で5行目をリードできます。

s = f_obj.next()

ファイル反復法は、効率を維持するためにバッファリングを使用し、そのバッファは.readline()ファイルオブジェクトのおよび他の読み取りメソッドと共有されません。したがって、反復メソッドと読み取りメソッドを混在させると、データを見逃してしまいます。

.next()メソッドのドキュメントから:

forループをファイルの行をループする最も効率的な方法(非常に一般的な操作)にするために、このnext()メソッドは非表示の先読みバッファーを使用します。先読みバッファを使用した結果、next()他のファイルメソッド(などreadline())と組み合わせても正しく機能しません。

.next()呼び出しを呼び出しに置き換えることもでき.readline()ます。一貫性を保ち、どちらか一方を使用してください。

于 2012-11-09T22:07:44.270 に答える