2011-09-13 78 views
1

我有一個叫做gett(int)的函數,它在每次調用時都會返回一個序列。當我寫這樣它工作正常:Python循環疑問

print gett(0) 
print gett(1) 

等..

但是當我嘗試在自動相同的循環是這樣的:

for a in range(28): 
    print gett(a) 

它工作正常的只有第一個值,我得到以下輸出:

[..series..] 
[] 
[] 
[] 
[] 
..and all others empty 

我對Python非常新,所以這可能是非常天真。任何幫助,高度讚賞。謝謝。

P.S. gett函數:

trend = file("D:\\trend.csv", "r") 

def gett(pos): 
    t = [] 
    for x in trend: 
     temp = x.split(',') 
     temp = temp[4:] 
     t.append(temp) 

    t = t[25:] 
    temp = [] 
    for a in t: 
     if a[pos] != '': 
      temp.append(a[pos]) 

    ############ 
    t = temp 
    ############ 
    return t 
+2

我們可以看到你GETT函數的代碼? – SingleNegationElimination

+0

該函數的源代碼將很有用 – Gautam

+0

添加了函數的源代碼 – mihsathe

回答

3

你打開函數定義之外的文件,然後試圖從全局文件對象來讀取每個函數運行的時間。在第一次運行函數後,讀指針將在文件的末尾,你什麼都不會讀。

每次通過函數讀取文件(seek開始如果您保持全局,或重新打開它,如果您使它成爲本地)或(幾乎肯定最好,除非它是一個巨大的文件和內存是一個問題)將整個文件讀入列表並在該列表上進行操作。

+0

這很棒。非常感謝。 – mihsathe

+0

@mihs你不需要每次都打開文件,如果你不想把它加載到內存中,你可以每次都使用'trend.seek(0)'。但是,由於'gett'頂部的'for'循環不會隨着'pos'而改變,所以您應該真的只做一次這個部分,然後每次函數是使用第二個for循環的同樣的列表調用。 – agf

4

在第一次迭代中,您完全讀取文件。

在隨後的所有迭代中,整個for x in trend:循環將因此被跳過。

怎麼是這樣的:

import csv 

def read_csv(): 
    with open("D:\\trend.csv", "rb") as f: 
     trend = csv.reader(f, delimiter=",") 
     temp = [row[4:] for row in trend] 
     return temp[25:] 

def gett(data, pos): 
    return [a[pos] for a in data if a[pos] != ""] 

現在你可以做

>>> mydata = read_csv() 
>>> gett(mydata, 0) 
[1, 2, 3, 4] 
>>> gett(mydata, 1) 
[5, 6, 7, 8] 
0

第一次讀取文件FilePointer到達文件末尾 因此,下次嘗試讀取文件它只是跳過它。

做的更好的辦法將是

def gett(pos , filename): 
    trend = file(filename, "r") 
    t = [] 
    for x in trend: 
     temp = x.split(',') 
     temp = temp[4:] 
     t.append(temp) 

    t = t[25:] 
    temp = [] 
    for a in t: 
     if a[pos] != '': 
      temp.append(a[pos]) 

    ############ 
    t = temp 
    ############ 
    return t 

你也可以嘗試,如果文件的大小是小

arr = [] 
for x in file("path/to/file" ,"r") 
    arr.append(x) 

gett(pos , arr)