sys.argv[1],IndexError:列表索引超出范围

20

我在以下Python代码段中遇到了问题:

# Open/Create the output file
with open(sys.argv[1] + '/Concatenated.csv', 'w+') as outfile:

    try:
        with open(sys.argv[1] + '/MatrixHeader.csv') as headerfile:
            for line in headerfile:
                outfile.write(line + '\n')
    except:
        print 'No Header File'

具体错误如下:

Traceback (most recent call last):
  File "ConcatenateFiles.py", line 12, in <module>
    with open(sys.argv[1] + 'Concatenated.csv', 'w+') as outfile:
IndexError: list index out of range

我已经做了一些研究,似乎在运行脚本时 sys.argv 可能需要在命令行添加一个参数,但我不确定应该添加什么或者问题出在哪里!我也搜索了网站,但是我发现的所有解决方案都没有注释和/或不包括像我的打开函数一样的内容。


1
应该只需要运行python ConcatenateFiles.py <some_directory>。假设您首先执行了import sys - brechmos
似乎在运行脚本时,sys.argv可能需要在命令行中添加参数,但我不确定应该添加什么或问题是什么。你知道什么是命令行吗?你明白这里的“参数”是什么意思吗? - Karl Knechtel
3个回答

18

sys.argv 表示执行脚本时的命令行选项。

sys.argv[0] 是正在运行的脚本的名称。所有其他选项都包含在 sys.argv[1:] 中。

您正在尝试打开一个文件,该文件使用 sys.argv[1](第一个参数)作为目录。

尝试运行类似以下的东西:

python ConcatenateFiles.py /tmp

这个有点成功了!现在我得到了“没有头文件”。 - DataGuy
你调用的第二个 open 语句没有指定打开模式。默认情况下,文件将以只读方式打开,如果文件不存在,则会失败。你需要将其更改为 with open(sys.argv[1] + '/MatrixHeader.csv', 'w') as headerfile: - Steve O'Driscoll

12

sys.argv是传递给Python脚本的命令行参数列表,其中sys.argv[0]是脚本名称。

如果没有传递任何命令行参数,则会出现错误,因此sys.argv的长度为1,因此sys.argv[1]超出了范围。

要“修复”,只需确保在运行脚本时传递一个命令行参数,例如:

python ConcatenateFiles.py /the/path/to/the/directory

然而,你可能想要使用一些默认目录,以便当你不传递目录时它仍然可以正常工作:

cur_dir = sys.argv[1] if len(sys.argv) > 1 else '.'

with open(cur_dir + '/Concatenated.csv', 'w+') as outfile:

    try:
        with open(cur_dir + '/MatrixHeader.csv') as headerfile:
            for line in headerfile:
                outfile.write(line + '\n')
    except:
        print 'No Header File'

cur_dir = sys.argv[1] if len(sys.argv) > 1 else '.' 这就是我一直在寻找的,我终于找到了。如果你不想传入参数,也没关系。谢谢 @lemonhead - TheWalkingData

5
我做了一些研究,似乎在运行脚本时,sys.argv可能需要一个命令行参数。

不是"可能需要",而是绝对需要。这就是sys.argv的全部意义,它包含命令行参数。像任何Python数组一样,访问不存在的元素会引发IndexError。

虽然代码使用try/except捕获一些错误,但有问题的语句出现在第一行。

因此,脚本需要一个目录名称,您可以通过查看len(sys.argv)并将其与1 +要求数量进行比较来测试是否存在目录名称。argv始终包含脚本名称和任何用户提供的参数,通常是空格分隔的,但用户可以通过引用覆盖空格拆分。如果用户未提供参数,则您可以选择提供默认值,提示用户或打印退出错误消息。

要在缺少参数时打印错误并退出,请在第一次使用sys.argv之前添加此行:

if len(sys.argv)<2:
    print "Fatal: You forgot to include the directory name on the command line."
    print "Usage:  python %s <directoryname>" % sys.argv[0]
    sys.exit(1)

sys.argv[0] 始终包含脚本名称,而用户输入则放置在随后的1、2等位置。

另请参阅:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接