2017-01-17 115 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