Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对Python的限制';地球仪?_Python_Glob_Arcpy - Fatal编程技术网

对Python的限制';地球仪?

对Python的限制';地球仪?,python,glob,arcpy,Python,Glob,Arcpy,我使用glob将文件名提供给循环,如下所示: inputcsvfiles = glob.iglob('NCCCSM*.csv') for x in inputcsvfiles: csvfilename = x do stuff here 我用来制作这个脚本原型的玩具示例可以很好地处理2个、10个甚至100个输入csv文件,但实际上我需要它来循环处理10959个文件。当使用这么多文件时,脚本在第一次迭代后停止工作,并且找不到第二个输入文件 考虑到脚本在“合理”的条目数(2-1

我使用
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
,但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)吗?同样,如果全局目录只有100个左右的文件,这将很好地工作,但是如果有很多文件(例如10959),它似乎在列表的某个地方任意失败。

尝试在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

如果它对100个文件有效,但对10000个文件无效,则检查
arcpy.AddJoin\u management
是否在完成后关闭
csvfile


进程在任何时候打开的文件数量都有限制(您可以通过运行
ulimit-n
来检查)。出现的一个问题不是Python本身,而是ArcPy和/或(我认为后者更重要)。循环迭代时,它会创建一个
schema.ini
文件,从而添加和存储循环中处理的每个CSV文件的信息。随着时间的推移,
schema.ini
变得相当大,我相信这就是性能问题出现的时候


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

是否打印(sum(1代表uu.in glob.iglob('NCCCSM*.csv'))打印正确数量的文件?对我来说有效。(操作系统X上的Python 2.7)。您确定在使用2个文件进行测试和10959之间没有更改
在此处执行操作吗?@J.F.Sebastian-是的,命令返回10,958@Wooble-肯定,只需重新运行相同的代码,即可处理100个csv文件(Python 2.6.5,Windows7 64位)@Prophet60091:这意味着glob可以按预期工作。注意:iglob返回一个迭代器,您只能对所有文件迭代一次,否则使用glob.glob()。这可能会产生比原始post请求的文件多得多的文件。即使
ls*
失败,glob也可以工作。glob、os.walk调用以列表形式返回文件名的相同os.listdir()。10000是一个小数字。@mgilson可以添加一个额外的检查。@J.F.Sebastian--(好的评论)我认为有必要指出
glob('*')
(就实现而言)与执行
ls*
相比,执行
ls*
更接近于执行
ls
。您可以很容易地证明
ls*
可以很好地处理10000个文件<代码>触摸NCCCSM{0..9999}.csv&&ls*
。这里没有故障,而且速度很快。