Python循环怀疑

时间:2011-09-13 14:59:40

标签: python

我有一个名为gett(int)的函数,它在每次调用时返回一个序列。我这样写的时候工作正常:

print gett(0)
print gett(1)

依旧......

但是当我尝试在这样的for循环中自动执行相同的操作时:

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

3 个答案:

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

答案 1 :(得分:3)

您正在打开函数定义之外的文件,然后在每次运行函数时尝试从全局文件对象中读取。在第一次运行该函数后,读指针将位于文件的末尾,您将不会读任何内容。

每次通过函数读取文件(seek到开头如果保持全局,或者如果你把它作为本地则重新打开它)或者(几乎可以肯定,除非它是一个巨大的文件和内存)是一个问题)将整个文件读入一个列表并对该列表进行操作。

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