在将其标记为重复之前,请听我讲话。
我的代码在终端上需要大量输入。它需要处理两个(或更多)轨迹文件(.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)。
答案 0 :(得分:0)
如果for
给您带来麻烦(使用len
和range
),为什么不简单地做:
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
我建议不要使用文件名和文件名等系统名称