限制Python的水珠?(Limitation to Python's glob?)

2019-09-20 06:36发布

我使用glob到文件名喂像这样一个循环:

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

for x in inputcsvfiles:

    csvfilename = x
    do stuff here

我用原型该脚本的玩具例子正常工作与2,10,甚至100输入CSV文件,但我实际上它需要遍历10,959文件。 当使用多个文件,脚本将停止在第一次迭代后的工作,未能找到第二个输入文件。

鉴于脚本工作绝对罚款条目的“合理”数量(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

该脚本在ArcPy中线路,其中“csvfile”变量被传递到命令失败。 报告的错误是,它无法找到指定的CSV文件(例如,“NCCSM20110101.csv”),而事实上,该CSV肯定是在目录中。 难道说你不能重复使用声明的变量(X)多次为我上面? 同样,这将正常工作,如果被glob'd目录只有100页左右的文件,但如果有一大堆(如10,959),它失败看似随意某处名单。

Answer 1:

所出现的一个问题是不是与Python本身,而是与ArcPy中和/或CSV文件MS处理 (更后者,我认为)。 作为循环迭代,它创建一个schema.ini文件,由此在所述环路处理的每个CSV文件信息被添加并存储。 随着时间的推移,该schema.ini变得相当大,我相信当性能出现问题之时。

我的解决办法,尽管也许不雅,是做删除schema.ini每个循环中的文件,以避免这个问题。 这样做让我来处理10K + CSV文件,尽管相当缓慢。 说实话,我们结束了用草和BASH脚本进行到底。



Answer 2:

如果它适用于100个文件,但失败了10000,然后检查arcpy.AddJoin_management关闭csvfile它是用它做了。

目前,正在对一个进程可以在任何一个时间(你可以通过运行检查打开的文件数量的限制ulimit -n )。



Answer 3:

试着做一个LS *外壳上那些10,000个条目和外壳会失败过。 如何行走的目录,并获得这些文件逐一为你的目的是什么?

#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


文章来源: Limitation to Python's glob?