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

Dat*_*Guy 10 python

我遇到了以下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'
Run Code Online (Sandbox Code Playgroud)

具体来说错误如下:

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
Run Code Online (Sandbox Code Playgroud)

我做了一些研究,似乎sys.argv在运行脚本时可能需要在命令行进行参数,但我不确定要添加什么或问题可能是什么!我也搜索了网站,但我发现的所有解决方案都没有评论和/或不包括我的开放功能.

任何帮助是极大的赞赏.

Ste*_*oll 9

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

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

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

尝试运行这样的东西:

python ConcatenateFiles.py /tmp
Run Code Online (Sandbox Code Playgroud)


lem*_*ead 7

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

它是错误的,因为你没有传递任何命令行参数,因此sys.argv长度为1,因此sys.argv[1]超出范围.

要"修复",只需确保在运行脚本时传递命令行参数,例如

python ConcatenateFiles.py /the/path/to/the/directory
Run Code Online (Sandbox Code Playgroud)

但是,您可能希望使用某个默认目录,以便在未传入目录时它仍然有效:

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'
Run Code Online (Sandbox Code Playgroud)


Pau*_*aul 5

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

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

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

因此该脚本需要一个目录名称,您可以通过查看len(sys.argv)并与 1+number_of_requirements 进行比较来测试是否有目录名称。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)
Run Code Online (Sandbox Code Playgroud)

sys.argv[0]始终包含脚本名称,用户输入放置在后续插槽 1、2、...

也可以看看: