2013-04-22 1 views
0

У меня возникли проблемы с этим кодом. Хотя ошибки имен, по-видимому, распространены, я не смог найти решение, выполнив поиск. Вот код ...NameError ... глобально не определено

def fmp_sel(): 
    with open ('MonPlotDb.csv', 'rU') as csvfile: 
      next(csvfile, None) 
      fmpList = csv.reader(csvfile, delimiter=',', dialect=csv.excel_tab) 
      for item in enumerate(fmpList): 
        print "[%d] %s" % (item) 
    while True: 
     try: 
      in_Sel = raw_input(('''Choose from list or 'q' to quit:'''))            
      if in_Sel == 'q': 
       print 'Quit?'           
       conf = raw_input('Really? (y or n)...')  
       if conf == 'y':            
        print 'Seeya!'           
        break 
       else: 
        continue               
      plotOrig = DataPlotLoc[int(in_Sel) + 1]        
      print 'You selected', plotOrig[1]     
      break 
     except (ValueError, IndexError): 
      print 'Error: Try again' 

и отслеживающий ....

File "E:\FireRegDb\Rec_2012\dblist_outonly.py", line 28, in fmp_sel 
plotOrig = DataPlotLoc[int(in_Sel) + 1]        
NameError: global name 'DataPlotLoc' is not defined 

Эта функция вызывается из основной(), но я не могу понять, почему «DataPlotLoc» является глобальное имя так как он находится внутри этой функции. В любом случае, я думаю, что мне не хватает строки, чтобы определить его, но как и где я не знаю. Мне бы очень хотелось помочь.

EDIT: Просто добавьте дополнительную информацию .. 'DataPlotLoc' был именем списка, когда он был вставлен в код, т.е. DataPlotLoc = [['a', 'b', 'c', ....]], и это сработало. Строка plotOrig = DataPlotLoc [int (in_Sel) + 1] относится к этому списку, но, очевидно, теперь он считывается csv.reader, поэтому теперь я не уверен, как назначить эту переменную. Я предполагал, что мне все еще нужно принять целое число после подтверждения того, вводит ли пользователь «q» или нет, а +1 - добавить к введенному числу, чтобы он выравнивался с правильным номером индекса для соответствующего элемента строки, выбранного из списка , Извините, если это немного запутанно, но я немного смутил себя ...

ответ

2

Ну, как говорится в сообщении об ошибке, вы используете DataPlotLoc перед его определением. Если вы будете искать свой код, вы увидите, что он нигде не определен. На самом деле я не могу ответить больше, не зная, что вы имеете в виду.

Python предполагает, что вы имели в виду глобальную переменную этого имени, потому что вы никогда ничего не назначали ему, что сделало бы ее локальной переменной.

+0

+1. Часть «глобального имени» ошибки может быть немного запутанной для новых пользователей, но простой способ подумать об этом: если вы не определяете 'DataPlotLoc' локально _or_ глобально, сообщение об ошибке говорит« global ». Если вы хотите понять _why_, то это сообщение об ошибке, вы должны узнать, как Python решает, когда искать locals vs.Глобал; если вы просто хотите его исправить, просто назначьте его либо локально, либо глобально, в зависимости от того, что подходит для вашего дизайна. – abarnert

+0

Как вы можете видеть, я сначала пытаюсь получить пользовательский ввод, чтобы проверить, входят ли они в «q», а затем принять целочисленный ввод после, который является номером индекса для пользователя, чтобы выбрать строку в списке. Теперь я могу видеть, как я не определил DataPlotLoc, но это должно быть правильное имя файла csv? –

0

Python говорит global name ... not defined, потому что он не видит никакого назначения DataPlotLoc в теле функции, поэтому предполагает, что он должен быть глобальной переменной и не может найти его там. (Смотрите комментарий abarnert по ниже)

Судя из вашего кода, я полагаю, вы хотите DataPlotLoc содержать информацию, извлекать из MonPlotDb.csv, в этом случае вам нужно сделать две вещи:

(A) Инициализировать DataPlotLoc

def fmp_sel(): 
    DataPlotLoc = [] # <-----------------!!!! 
    with open ('MonPlotDb.csv', 'rU') as csvfile: 

(B) Добавьте значения в DataPlotLoc, пока вы зацикливаете и печатаете параметры.

next(csvfile, None) 
    fmpList = csv.reader(csvfile, delimiter=',', dialect=csv.excel_tab) 
    for item in enumerate(fmpList): 
     DataPlotLoc.append(item[1]) # <---------!!! 
     print "[%d] %s" % (item) 

Я не уверен, почему вы добавите в линии для plotOrig = DataPlotLoc[int(in_Sel) + 1], и я думаю, что вы можете быть в состоянии упростить csv.reader линию к следующему csv.reader(csvfile) (я думаю, что первенствует с запятыми по умолчанию)

Редактировать: для того, чтобы извлечь только один столбец из каждой строки CSV изменить код в части в на что-то вроде следующего:

next(csvfile, None) 
    fmpList = csv.reader(csvfile, delimiter=',', dialect=csv.excel_tab) 
    for item in enumerate(fmpList): 
     i, data = item # enumerate returns tuples of the form (i, data) 
     vals = (i, data[1]) # <----- put in the proper index of the column 
     DataPlotLoc.append(vals) 
     print "[%d] %s" % vals # <--- assuming you want to change the print as well 
+0

PS, кто-нибудь знает, была ли обновлена ​​спецификация Markdown, позволяющая запускать списки с номерами, отличными от 1? блоки кода и нумерация не играют хорошо ... – Felipe

+0

На самом деле это не так, что «последнее место, которое он смотрит, находится в глобальном масштабе». Это полезный способ подумать об этом для новичков, но реальность такова, что Python просто смотрит в глобалы. (В то время, когда он оценивал тело функции для создания объекта «code», он видел, что явных присвоений «DataPlotLoc» не было, и поэтому не добавлял его в «co_names». Таким образом, даже если вы подкрашиваете значение в «locals», Python никогда не будет там смотреть.) Так что ответ kindall более точный. Но я думаю, если вы изменили это, так что это было не технически ложно, это могло бы быть более полезным. – abarnert

+0

Мне не нужна эта глобальная переменная. Эта строка должна допускать целочисленный ввод и выбор из списка на основе номера индекса (следовательно, +1 для выравнивания с правильным номером индекса после удаления строки заголовка). Это работало, когда у меня был фактический список в верхней части функции ie. DataPlotLoc = [[a, b, c, d .....], но я хотел прочитать его из csv-файла, поэтому я добавил строку «with open ....». Не уверен, куда идти отсюда –

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

  • Нет связанных вопросов^_^