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

2024-09-26 22:55:37 发布

您现在位置: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'

具体错误如下:

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在运行脚本时可能需要在命令行中使用一个参数,但我不确定要添加什么或可能出现什么问题!我也搜索过这个网站,但是我找到的所有解决方案要么没有评论,要么没有像我的那样包含open函数。

任何帮助都非常感谢。


Tags: csv代码inascreatewithsysline
3条回答

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'

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

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

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

试着运行这样的程序:

python ConcatenateFiles.py /tmp

I've done some research and it seems that the sys.argv might require an argument at the command line when running the script

并非可能,但肯定需要。这就是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、。。。

另见:

相关问题 更多 >

    热门问题