对Python的glob的限制?

2024-10-01 15:31:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用glob将文件名馈送到如下循环:

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

for x in inputcsvfiles:

    csvfilename = x
    do stuff here

我用来制作这个脚本原型的玩具示例可以很好地处理2个、10个甚至100个输入csv文件,但实际上我需要它遍历10959个文件。当使用这么多文件时,脚本在第一次迭代后停止工作,并且找不到第二个输入文件。在

考虑到脚本在“合理”的条目数(2-100)下工作得非常好,但是对于我需要的(10959)没有更好的方法来处理这种情况,或者我可以设置一些允许大量迭代的参数吗?在

PS-最初我使用的是glob.glob,但是球.iglob再好不过了。在

编辑:

以上内容的扩展。。。在

^{pr2}$

脚本在ArcPy行失败,其中“csvfile”变量被传递到命令中。报告的错误是找不到指定的csv文件(例如,“NCCSM20110101.csv”),而实际上,csv肯定在目录中。是不是你不能像我上面提到的那样多次重用一个声明的变量(x)?同样,如果被glob的目录只有100个左右的文件,这将很好地工作,但是如果有很多文件(例如10959个),它似乎在列表的某个地方任意地失败了。在


Tags: 文件csvin目录脚本forhere文件名
3条回答

出现的一个问题不是Python本身,而是ArcPy和/或MS handling of CSV files(我认为是后者)。当循环迭代时,它创建一个schema.ini文件,在这个文件中,循环中处理的每个CSV文件的信息将被添加和存储。随着时间的推移,schema.ini变得相当大,我相信这就是性能问题出现的时候。在

我的解决方案,虽然可能不够优雅,但是在每个循环中都要删除schema.ini文件,以避免这个问题。这样做允许我处理10k+CSV文件,尽管速度相当慢。说实话,我们最终还是使用了GRASS和BASH脚本。在

如果它对100个文件有效,但对10000个文件失败,那么检查arcpy.AddJoin_management是否关闭{}。在

一个进程在任何时候打开的文件数是有限制的(您可以通过运行ulimit -n)来检查这个数目。在

尝试在shell上对这10000个条目执行ls*,shell也会失败。不如浏览一下目录,把这些文件一个接一个地交给你?在

#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

相关问题 更多 >

    热门问题