2017-01-17 5 views
0

Итак, я пытаюсь использовать глобальные переменные, которые будут использоваться в цикле For. Этот код работает без ошибок, если не в функции «def», но мне нужно, чтобы это было так, как я пытаюсь создать диалоговое окно tkinter-файла, которое запускает код после выбора файла, если вы можете либо помочь мне рассказать, что я делаю неправильно или дать мне альтернативу использованию tkinter и «def».Python3 как объявить глобальные переменные для цикла «For»

Рабочий код:

import os 
import sqlite3 
from datetime import datetime 
# import datetime 
import itertools 
from dateutil.relativedelta import relativedelta 
date = datetime.strptime('1991-01-01', '%Y-%m-%d') 
f_path = 'C:/Users/Lewis Collins/Job_Code/data/cru_ts_2_10.1991-2000_cutdown.pre' 

# db = sqlite3.connect('output.db') 
# cursor = db.cursor() 
# cursor.execute('CREATE TABLE Rainfall (Xref, Yref, Date, Value)') 
# date = datetime.date(1991,1,1) 

flag = 0 

Xref = '' 

Yref = '' 

with open(f_path) as file_read: 

    for row in itertools.islice(file_read, 5, None): 
     # print(row) 
     if 'Grid-ref' in row: 
      Xref = row.split(',')[0].split('= ')[1] 
      Yref = row.split(',')[1] 
      date = datetime.strptime('1990-12-01', '%Y-%m-%d') 
     else: 
      for Value in row.split(): 
       date = date + relativedelta(months=+1) 
       # print(Xref.strip(), Yref.strip(), date, Value) 

       # print(Xref, Yref, date, Value) 

# db.commit() 
# db.close() 

Edited Код:

import tkinter 
from datetime import datetime 
from dateutil.relativedelta import relativedelta 
import itertools 

#date = datetime.strptime('1991-01-01', '%y-%m-%d') 

# date = datetime.strptime('1991-01-01', '%Y-%m-%d') 
f_path = 'C:/Users/Lewis Collins/Job_Code/data/cru_ts_2_10.1991-2000_cutdown.pre' 
Xref = '' 
Yref = '' 



def read_date(): 

    with open(f_path) as file_read: 

     for row in itertools.islice(file_read, 5, None): 

      if 'Grid-ref' in row: 
       Xref = row.split(',')[0].split('= ')[1] 
       Yref = row.split(',')[1] 
       date = datetime.strptime('1990-12-01', '%y-%m-%d') 
      else: 
       for Value in row.split(): 
        date = date + relativedelta(months=+1) 
        print(Xref.strip(), Yref.strip(), date, Value) 
+0

Не используйте глобальную переменную. Вместо этого верните результат своей функции. – spectras

ответ

0

PS с использованием глобальных переменных не рекомендуется использовать их только тогда, когда ее ваш последний путь

добавить глобальное ключевое слово в вашей функции:

my_blobal_var 
my_blobal_var2 

def my_func(): 
    global my_blobal_var 
    global my_blobal_var2 
    do_something() 

для случая

Xref = '' 
Yref = '' 

def read_date(): 
     global Xref 
     global Yref 
     do_your_thing() 
+0

Когда я делаю это, я получаю новую ошибку, которая снова я не совсем понимаю, как раньше я сказал, что код почти идентичен оригиналу, я добавлю изменения вместе с ошибкой –

+0

или на самом деле извините, это будет нарушением, так как вопрос имеет был получен ответ –

+0

Я не знаю, является ли это нарушением или нет, но если ваш вопрос решен, отметьте его как решение :) –

0

Не использовать глобальную переменную. Это почти всегда ошибка. Передайте аргументы в вашу функцию и она возвращает результаты:

def read_date(path): 
    xref = '' 
    yref = '' 
    with open(path) as file_read: 
     for row in itertools.islice(file_read, 5, None): 
      if 'Grid-ref' in row: 
       xref = row.split(',')[0].split('= ')[1] 
       yref = row.split(',')[1] 
       date = datetime.strptime('1990-12-01', '%y-%m-%d') 
      else: 
       for Value in row.split(): 
        date = date + relativedelta(months=+1) 
        print(Xref.strip(), Yref.strip(), date, Value) 
    return xref, yref, date, Value 

Таким образом, xref, yref ... локальные переменные внутри вашей read_date функции. Когда это будет сделано, он вернет свое значение вызывающему. Он также принимает путь к файлу в качестве аргумента, а не привязан к глобальной переменной. Вы назвали бы это так:

Xref, Yref, date, Value = read_date(f_path) 

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

+0

Мне нужно «Xref Yref date Value», так как мой следующий шаг добавляет их в базу данных в 4 столбца, что В этом нижнем разделе кода вы можете объяснить это. Спасибо –

+0

Обновлено. Вызов показывает, как вызвать вашу функцию из вашей основной программы. Он передает 'f_path' как путь к открытию и помещает возвращаемые значения в четыре переменные: Xref, Yref, Date и Value. (Фактический процесс называется * распаковкой *: 4-элемент значений распаковывается в 4 переменные.) – spectras

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