循环只能运行一次

时间:2018-09-14 06:14:47

标签: python

在将其标记为重复之前,请听我讲话。

我的代码在终端上需要大量输入。它需要处理两个(或更多)轨迹文件(.gro,以逗号分隔)。这是终端上的输入内容:

  

script -c'python script.py -f traj1.gro,traj2.gro -i 1 -s 30 ...(其他信息)'logfile.log

在我的脚本中,要分隔'-f'之后的两个traj文件,我使用以下代码:

files = []

...

for i in sys.argv[1:]:
    if i == '-f':
        file = sys.argv[sys.argv.index('-f')+1] #input filenames after -f
        for j in file.split(','):
            global files
            files.append(j)

for s in range(len(files)):
    file = ''
    print s
    print files[s]
    file = files[s]

    ... (rest of the code inside this branch)

现在该代码应该一次遍历每个traj文件。

起初,它工作正常。处理第一个文件,并打印“ 0”和文件名。但是处理完成后,它会打印:

  

1

     

回溯(最近通话最近一次):

     

文件

中的文件“ script.py”,第462行      

文件=文件[s]

     

IndexError:列表索引超出范围

     

脚本完成,文件为logfile.log

len(files)为2时,范围如何?它还清楚地打印了“ 1”,因此我们知道for s in range(len(files))行不仅工作了一次,而且第二次工作了,它只是没有执行其余的代码块,也没有打印第二个文件名(索引1)。

2 个答案:

答案 0 :(得分:0)

如果for给您带来麻烦(使用lenrange),为什么不简单地做:

for file in files:
    print file

更简单,更清洁,它可以为您提供确切的错误提示。

我怀疑您稍后会在代码中更改s变量(或可能更改files变量)。另外,我可以建议使用argparse吗?

答案 1 :(得分:0)

我删除了全局分配(除了使其成为python 3),并使用了较短的测试命令python script.py -f traj1.gro,traj2.gro -i 1 -s 30进行了测试:

import sys
files = []
#global files

for i in sys.argv[1:]:
    if i == '-f':
        file = sys.argv[sys.argv.index('-f')+1] #input filenames after -f
        for j in file.split(','):
            files.append(j)

for s in range(len(files)):
    file = ''
    print(s)
    print(files[s])
    file = files[s]

它吐出来了:

0
traj1.gro
1
traj2.gro

我建议不要使用文件名和文件名等系统名称