views:

31

answers:

2

I am reading a csv file several times, but cutting its size every 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  A: 
  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.
adamk
Are these answers to @ahhh's problem? This seems like it should be in a comment to me.
Wilduck
@Wilduck - I agree that your way is more educational. Regarding your question:(1) is a clarification.(2) is the actual answer (as far as I see).(3) is a general observation regarding the code.
adamk
Good show then. Have an upvote.
Wilduck
A: 

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.

JAB