Python while循环问题

时间:2012-01-14 23:12:28

标签: python file-io while-loop

Infile是一个家谱:

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

我想从infile打印出每一代人的时间,最后我想要平均值。在这里,我认为我的问题是,当infile结束时line2超出范围:

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在这里没有改变值:

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()两次? 有关这两者如何解决的任何想法?

Thanx all,这就是结果:

   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()

5 个答案:

答案 0 :(得分:1)

您可以使用以下语句迭代文件的全部内容:

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

你不想使用while循环,除非你有一些计数器来切换索引位置(即你使用了infile.readlines()并希望使用while循环)。

答案 1 :(得分: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

答案 2 :(得分: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(),这样当你的名字与空格 tabs
  • 使用with语法打开文件并确保之后关闭文件也是个好主意

关于你问题的最后部分,“我为什么要写两次main()?”那是因为你第一次定义 main函数,第二次调用它。

答案 3 :(得分: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)

第一行是python进入程序的本机入口。它相当于C的“int main()”。

接下来,如果您将文件中的所有行都读入列表,则可能最容易设置列表推导。

第4行遍历文件行,在选项卡中拆分它们,只从新拆分列表中检索第2项(索引1)。

答案 4 :(得分: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)