2

私はglob次のようにファイル名をループにフィードするために使用しています:

inputcsvfiles = glob.iglob('NCCCSM*.csv')

for x in inputcsvfiles:

    csvfilename = x
    do stuff here

このスクリプトのプロトタイプを作成するために使用したおもちゃの例は、2、10、または100個の入力csvファイルで正常に機能しますが、実際には、10,959個のファイルをループする必要があります。その数のファイルを使用すると、スクリプトは最初の反復後に機能を停止し、2番目の入力ファイルを見つけることができません。

スクリプトは「妥当な」数のエントリ(2〜100)で完全に正常に機能しますが、必要な数(10,959)では機能しないことを考えると、この状況を処理するためのより良い方法、または設定できるある種のパラメータがあります。多数の反復を許可しますか?

PS-最初は使用してglob.globいましたが、glob.iglobフェアはそれ以上のものではありません。

編集:

より多くのコンテキストのための上記の拡張...

    # typical input file looks like this: "NCCCSM20110101.csv", "NCCCSM20110102.csv", etc.   
    inputcsvfiles = glob.iglob('NCCCSM*.csv')

    # loop over individial input files    
      for x in inputcsvfiles:

        csvfile = x
        modelname = x[0:5]

        # ArcPy
        arcpy.AddJoin_management(inputshape, "CLIMATEID", csvfile, "CLIMATEID", "KEEP_COMMON")

        do more stuff after

スクリプトは、「csvfile」変数がコマンドに渡されるArcPy行で失敗します。報告されたエラーは、実際にはcsvが確実にディレクトリにあるのに、指定されたcsvファイル(「NCCSM20110101.csv」など)が見つからないことです。上記のように、宣言された変数(x)を複数回再利用できない可能性がありますか?繰り返しになりますが、これは、グロブされているディレクトリに100程度のファイルしかない場合は正常に機能しますが、大量のファイル(たとえば、10,959)がある場合は、リストのどこかで任意に失敗します。

4

3 に答える 3

1

100個のファイルで機能するが、10000で失敗する場合は、処理が完了した後にarcpy.AddJoin_management閉じることを確認してくださいcsvfile

プロセスが一度に持つことができる開いているファイルの数には制限があります(これはを実行することで確認できますulimit -n)。

于 2012-07-26T22:01:06.467 に答える
1

これらの 10,000 エントリに対してシェルで ls * を実行してみてください。シェルも失敗します。ディレクトリをたどって、目的のためにそれらのファイルを 1 つずつ作成してみてはどうでしょうか。

#credit - @dabeaz - generators tutorial

import os
import fnmatch

def gen_find(filepat,top):
    for path, dirlist, filelist in os.walk(top):
        for name in fnmatch.filter(filelist,filepat):
            yield os.path.join(path,name)

# Example use

if __name__ == '__main__':
    lognames = gen_find("NCCCSM*.csv",".")
    for name in lognames:
        print name
于 2012-07-26T18:11:42.210 に答える