2012-01-14 204 views
2

INFILE是一個家譜:Python的while循環問題

holla 1755 
ronaj 1781 
asdflæj 1803 
axle 1823 
einar 1855 
baelj 1881 
æljlas 1903 
jobbi 1923 
gurri 1955 
kolli 1981 
Rounaj 2004 

我想從INFILE和我想的平均最終打印出每一代人的時間。在這裏,我想我的問題是,line2失控的範圍時INFILE結束:

def main(): 
    infile = open('infile.txt', 'r') 
    line = infile.readline() 
    tmpstr = line.split('\t') 
    age=[] 
    while line !='': 
     line2 = infile.readline() 
     tmpstr2 = line2.split('\t') 
     age.append(int(tmpstr2[1]) - int(tmpstr[1])) 
     print age 
     tmpstr = tmpstr2 
    infile.close() 
    print sum(age)*1./len(age) 
main() 

所以我決定閱讀所有信息列表,但tmpstr doesn't變化值這裏:

def main(): 
    infile = open('infile.txt', 'r') 
    line = infile.readline() 
    age=[] 
    while line !='': 
     tmpstr = line.split('\t') 
     age.append(tmpstr[1]) 
     print age 
    infile.close() 
    print sum(age)*1./len(age) 
main() 

怎麼來的?這兩個腳本有什麼問題?爲什麼我兩次寫main()? 任何想法如何解決這兩個問題?

感謝名單全部,這是它是如何結束:

def main(): 
     with open('infile.txt', 'r') as input: 
      ages = [] 
      for line in input: 
       data = line.split() 
       age = int(data[1]) 
       ages.append(age) 
      gentime = [] 
      for i in xrange(len(ages)-1): 
       print ages[i+1] - ages[i] 
       gentime.append(ages[i+1] - ages[i]) 
      print 'average gentime is', sum(gentime)*1./len(gentime) 
    main() 
+0

我的建議是去[codereview.se]代替。 – 2012-01-14 23:20:27

+1

@Martin:codereview.SE不適用於破損的代碼。 – 2012-01-14 23:23:43

+0

@NiklasBaumstark:好的,好點。我以前沒有這樣想過。 – 2012-01-14 23:26:42

回答

1

試試這個:

def main(): 
    with open('infile.txt', 'r') as input: 
     ages, n = 0, 0 
     for line in input: 
      age = int(line.split()[1]) 
      ages += age 
      n += 1 
      print age 
     print 'average:', float(ages)/n 

一些評論:

  • 你不需要使用一個列表來累加數字,幾個局部變量就足夠了
  • 在這種情況下,使用split()沒有參數是個好主意,這樣當你輸入名稱是從數量在它前面的空格標籤
  • 這也是使用with語法打開一個文件,並確保它被後來

關閉對於一個好主意分離你的問題的最後一部分,「爲什麼我要寫main()兩次?」那是因爲第一次你定義爲main函數,第二次你調用它。

+0

也許你寧願'漂浮(年齡)/ n' – 2012-01-14 23:40:07

+0

@NiklasBaumstark你是對的,謝謝。 – 2012-01-14 23:41:17

1

可以遍歷使用此語句文件的全部內容:

for line in infile: 
    # Perform the rest of your steps here 

你不希望使用while循環,除非你有某種計數器來切換索引位置(例如,你使用infile.readlines(),並希望使用while循環)。

1

在第二個實例中,您的代碼只從文件中讀取一行。

簡單的東西,如:

age = [] 
with open('data.txt', 'rt') as f: 
    for line in f: 
     vals = line.split('\t') 
     age.append(int(vals[1])) 

print sum(age)/float(len(age)) 

產生

1878.54545455 
1

你可以嘗試這樣的事情:

if __name__ == "__main__": 
    file = open("infile.txt", "r") 
    lines = file.readlines() 
    gens = [int(x.split('\t')[1]) for line in lines] 
    avg = sum(gens)/len(gens) 

第一行是本地入口處蟒蛇到一個程序。它相當於C的「int main()」。

接下來,如果您將文件中的所有行讀入列表,它可能最容易設置列表解析。

第4行遍歷文件行,在標籤處對它們進行拆分,並僅從新分割的列表中檢索第2項(在索引1處)。

1

這兩個腳本的問題是您的while循環是無限的。條件line != ''將永遠不會爲假,除非第一行爲空。

你可以解決這個問題,但最好是使用Python成語:

lastyear = None 
ages = [] 
for line in infile: 
    _name, year = line.split('\t') 
    year = int(year) 
    if lastyear: 
     ages.append(year - lastyear) 
    lastyear = year 
print float(sum(ages))/len(ages) 
+0

爲什麼要強調_name中的第一個字符? – AWE 2012-01-15 09:07:03

+0

這只是向讀者暗示'_name'是元組解包所需要的,但不會被使用。看[這個答案](http://stackoverflow.com/a/8378213/1002469)。 – 2012-01-15 13:36:36