切换文件以在python .csv阅读器中读取

时间:2010-07-12 17:09:59

标签: python file-io csv

我正在多次阅读csv文件,但每次通过时都要缩小它的大小。所以,一旦我到达底部,我正在编写一个新的csv文件,例如,.csv文件的下半部分。然后我想改变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"

为什么这不起作用?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我建议如下:

使用for something in r_send:而不是something = r_send.next();你甚至不需要尝试...除了块,因为你只需要把原始文件放在那个循环之外的东西(正如别人提到的那样,你甚至没有在当前代码中循环原始文件) 。然后你可能想要将所有这些包装在另一个循环中,以便它一直持续到文件被完全操作为止。

使用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)

类似的东西。