2012-01-14 156 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