2015-07-28 2 views
3

у меня возникли проблемы с следующем разделе кода Python:sys.argv [1], IndexError: список индексов вне диапазона

# 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 

Я провел некоторое исследование, и кажется, что может потребовать аргумент в командной строке при запуске скрипта, но я не уверен, что добавить или что может быть проблемой! Я также искал сайт, но все решения, которые я нашел, либо не имеют комментариев, и/или не включают открытую функцию, как моя.

Любая помощь очень ценится.

+1

Это должно быть просто 'питон ConcatenateFiles.py '. Это предполагает, что вы сначала выполняете 'import sys' – brechmos

+0

. Попробовали ли вы Googling? – TigerhawkT3

+0

Да, я попробовал это. – DataGuy

ответ

2

sys.argv представляет параметры командной строки, с которыми выполняется сценарий.

sys.argv[0] - имя скрипта, в котором вы работаете. Все дополнительные опции содержатся в sys.argv[1:].

Вы пытаетесь открыть файл, который использует sys.argv[1] (первый аргумент) как что-то вроде каталога.

Попробуйте запустить что-то вроде этого:

python ConcatenateFiles.py /tmp 
+0

Это работало, мягко! Теперь я получаю «Нет файла заголовка» – DataGuy

+0

Второй вызов 'open', который вы вызываете, не указывает открытый режим. По умолчанию открывается файл как доступный только для чтения, который не будет работать, если файл не существует. Вам нужно будет изменить это на 'with open (sys.argv [1] + '/MatrixHeader.csv', 'w') в качестве заголовочного файла:' –

3

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 + number_of_requirements. Арвв всегда содержит имя сценария плюс любые параметры, предоставленные пользователем, обычно пробел, но пользователь может переопределить разделение пробела путем цитирования. Если пользователь не предоставляет аргумент, ваш выбор по умолчанию задает запрос, запрашивает пользователя или печатает сообщение об ошибке выхода.

Чтобы напечатать сообщение об ошибке и выходе, когда аргумент отсутствует, добавьте эту строку перед первым использованием 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, ...

Смотри также:

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' 
+0

Спасибо, всем! – DataGuy

+0

'cur_dir = sys.argv [1] если len (sys.argv)> 1 else '.'' Это то, что я искал, и я нашел его. Если вы не хотите передавать аргумент, вам не нужно. Благодаря @lemonhead – TheWalkingData

Смежные вопросы