开发者

Switching files to read from in python's .csv reader

I am reading a csv file several times, but cutting its size e开发者_如何学Cvery time I go through it. So, once I've reached the bottom, I am writing a new csv file which is, say, the bottom half of the .csv file. I then wish to change the csv reader to use this new file instead, but it doesn't seem to be working... Here's what I've done.

                    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)

where cutFile does..

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"

Why is this not working?


  1. Is something = r_send.next() in some kind of loop? The way you wrote it, it's only going to read one line.
  2. Why do you need ",".join(line)? You can simply print line itself, and it should work.
  3. Plus, there really is no need to seek(0) before closing a file.


I suggest the following:

Use for something in r_send: rather than something = r_send.next(); you won't even need the try... except blocks, as you'll just put the stuff closing the original file outside that loop (as someone else mentioned, you aren't even looping through the original file in your current code). Then you'll probably want to wrap all that in another loop so it keeps continuing until the file has been fully manipulated.

Use new_sent.write(line) instead of print >> new_sent, ",".join(line). Not that it makes that much of a difference besides the ",".join bit (which you don't need since you aren't using the csv module to write to a file), which you shouldn't be using here anyway, but it makes the fact that you're writing to a file more evident.

So...

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)

Something like that.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜