循环的Python上限

时间:2014-02-27 15:33:50

标签: python

首先让我说我对python很新。

好的,我正在运行代码来对数据文件执行物理计算/绘制图形等,我需要做的是循环遍历许多文件和子文件。但问题是每个文件中存在不同数量的子文件(例如,文件0具有711个子文件,文件1具有660个奇数)。当我在索引x上没有子文件的文件中运行它时,它显然不喜欢它,所以我想知道有没有办法让它运行(迭代?)到最后的限制每个文件自动?

我得到的是一个嵌套循环,如:

for i in range(0,120):
    for j in range(0,715):

         stuff

提前为任何帮助干杯,如果我的解释不好,请对不起!

编辑: 一些更多的代码。所以我实际上在做的是计算/绘制气体和暗物质粒子的角动量。这些是halos(j),&有许多文件(i)包含许多这些光晕。

import getfiby
import numpy as np 
import pylab as pl


angmom=getfiby.ReadFIBY("B")

for i in range(0,120):
    for j in range(0,715):

        pos_DM = angmom.getParticleField(49,i,j,"DM","Coordinates")
        vel_DM = angmom.getParticleField(49,i,j,"DM","Velocity")
        mass_DM = angmom.getParticleField(49,i,j,"DM","Mass")
        more stuff

getfiby是我给出的代码,它从文件中检索所有数据(我看不到)。这不是一个真正的大问题,因为我仍然能够运行计算和运算。即使我在j的范围内设置的上限超过了特定文件中的晕圈数量(我得到:Halo索引超出范围。再见。)但是,我只是想知道是否有更好,更整洁的情节让它运行的方式。

4 个答案:

答案 0 :(得分:1)

你可能想要这样的东西:

a=range(3)
for i in range(5):
    try:
        b=a[i] #if you iterate over your "subfiles" by index
    except IndexError:
        break #break out when list index out of range

答案 1 :(得分:0)

当您构建要处理的文件和子文件列表时,您可以将列表放在名为filelist的变量中,将子文件列表放在名为subfilelist的变量中。然后可以将循环运行为

for myfile in filelist:
  # Process code
  for subfile in subfilelist:
    # Process code.

如果您需要使用范围,那么

filerange = len(filelist)
subfilerange = len(subfilelist)

for i in range(0, filerange):
  for j in range(0, subfilerange):

答案 2 :(得分:0)

我可能在这里误解了你的结构/意图,但听起来你想对某些文件夹结构中的每个文件执行一些计算,其中文件夹包含不同数量的数据文件。在这种情况下,我会使用os.listdir函数,而不是尝试手动索引每个数据文件。

import os
for file in os.listdir(ROOT_DIRECTORY):
    for subfile in os.listdir(os.path.join(ROOT_DIRECTORY, file)):
        process(os.path.join(ROOT_DIRECTORY, file, subfile)) # or whatever

这当然可以通过几种方式更容易看一下(我个人拥有自己的listdir包装器返回完整路径而不仅仅是基本名称),但那将是我的基本想法。

如果您需要每个文件的索引,您可以使用enumeratesorted的某种组合(例如for i, file in enumerate(sorted(os.listdir(...))))来获取它,但具体细节显然取决于你的文件名和目录结构。

答案 3 :(得分:0)

假设fileSet是一个可迭代的file个对象,并且每个file对象本身都是一个可迭代的subfile个对象,而不是:

    for i,file in enumerate(fileSet): 
        for j,subfile in enumerate(file):
            stuff

但是要仔细思考你是否真的需要索引ij,因为你已经有了filesubfile来引用你正在处理的对象用。如果您不需要索引,那就简单地说:

    for file in fileSet: 
        for subfile in file:
            stuff

现在,如果你通过“文件”实际意味着操作系统文件系统中的文件,那么我需要你解释一下该文件系统中的子文件是什么,因为文件系统文件通常不能嵌套,只有目录可以。

相关问题