2010-07-12 99 views
0

我正在多次读取csv文件,但每次经过它时都会缩小其大小。所以,一旦我到达底部,我正在编写一个新的csv文件,即.csv文件的下半部分。然后,我希望将csv阅读器改为使用这个新文件,但它似乎没有工作......这就是我所做的。切换文件以从python的.csv阅读器中读取

    sent = open(someFilePath) 
        r_send = csv.reader(sent) 
        try: 

         something = r_send.next() 

        except StopIteration: 
         sent.seek(0) 
         sent.close() 
         newFile = cutFile(someFilePath, someLineNumber) 
         sent = open(newFile, "r") 
         r_send = csv.reader(sent) 

其中cutFile呢..

def cutFile(sender, lines): 
    sent = open(sender, "r") 
    new_sent = open(sender + ".temp.csv", "w") 
    counter = 0 

    for line in sent: 
     counter = counter + 1 
     if counter >= lines: 
      print >> new_sent, ",".join(line) 

    new_sent.close() 
    return sender + ".temp.csv" 

这是为什么不工作?

+0

什么部分似乎没有工作?你收到什么错误信息?另外,你在某种循环中的代码的顶部部分? – Wilduck 2010-07-12 17:27:56

回答

1
  1. something = r_send.next()在某种循环?你写它的方式,它只会读一行。
  2. 为什么你需要",".join(line)?你可以简单地打印line本身,它应该工作。
  3. 另外,在关闭文件之前确实没有必要使用seek(0)
+0

这些答案是@ ahhh的问题吗?这似乎应该在我的评论中。 – Wilduck 2010-07-12 17:36:11

+0

@Wilduck - 我同意你的方式更具教育意义。关于你的问题: (1)是一个澄清。 (2)是实际答案(据我所知)。 (3)是关于代码的一般观察。 – adamk 2010-07-12 17:38:11

+0

然后好的表演。有一个upvote。 – Wilduck 2010-07-12 17:39:06

0

我建议如下:

使用for something in r_send:而非something = r_send.next();你甚至不需要try ... except块,因为你只需要把原始文件关闭到那个循环之外就可以了(就像其他人提到的那样,你甚至不会循环当前代码中的原始文件) 。那么你可能想要把所有的东西包装到另一个循环中,这样它就会一直持续下去,直到文件被完全处理。使用new_sent.write(line)而不是print >> new_sent, ",".join(line)。并不是说除了",".join位(因为您没有使用csv模块写入文件,您并不需要它),它们在这里不应该使用,但它使得事实上你正在写一个更加明显的文件。

所以......

sent = open(someFilePath) 
r_send = csv.reader(sent) 

someLineNumber = len(sent.readlines()) 

while someLineNumber > 0: 
    for something in r_send: 
     # do stuff 

    someLineNumber /= 2  # //= 2 in Python 3 

    sent.close() 
    newFile = cutFile(someFilePath, someLineNumber) 
    sent = open(newFile, "r") 
    r_send = csv.reader(sent) 

类似的东西。