2017-01-17 69 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() 

编辑代码:只要不建议使用全局变量

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 

这样,xrefyref,......是你read_date函数中的局部变量。完成后,它将它们的值返回给调用者。它还将文件路径作为参数,而不是绑定到全局变量。你会这样称呼它:

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

注:实际有用的数据是不是从你的代码示例清楚。只需返回您关心的任何结果,并在调用该函数时以相同的顺序收集它们

+0

我需要'外部参照Yref日期值',因为我的下一步是将它们添加到数据库的4列中,代码底部是否可以解释它?谢谢 –

+0

已更新。该调用显示如何从主程序调用您的功能。它传递'f_path'作为打开的路径,并将返回的值放入四个变量'Xref','Yref','date'和'Value'中。 (实际的过程被称为*解包*:一个4元组值被解压为4个变量。) – spectras