Thetravellingfool Thetravellingfool - 6 months ago 209
Python Question

Reading last row from csv file Python error

I am trying to return the last row from a csv file. I am modifying another function that I wrote previously that returns the last line from a text file. It seemed to work as expected at first, but now when I call the function it throws an error.

reader.seek(0, os.SEEK_END)
AttributeError: '_csv.reader' object has no attribute 'seek'





import os
import csv
def getLastFile(filename):
distance = 1024
with open(filename,'rb') as f:
reader = csv.reader(f)
reader.seek(0, os.SEEK_END)
if reader.tell() < distance:
reader.seek(0, os.SEEK_SET)
lines = reader.readlines()
lastline = lines[-1]
else:
reader.seek(-1 * distance, os.SEEK_END)
lines = reader.readlines()
lastline = lines[-1]
return lastline


Can someone please help me modify my code? I was pretty sure you could use seek in this way, maybe I'm mistaken? Thank you!

Answer

Here's the core concept in the accepted answer to Have csv.reader tell when it is on the last line applied to your variation of the problem. Since each row is potentially a different length, there's really no way around having to read the whole file.

import csv

def get_last_row(csv_filename):
    with open(csv_filename, 'r') as f:
        reader = csv.reader(f)
        lastline = next(reader)
        for line in reader:
            lastline = line
        return lastline

Update:

Here's a simpler and likely faster way to do it using a deque. I got the idea from one of the answers to the question How to read an output line containing a list of integers produced by python.

from collections import deque
import csv

def get_last_row(csv_filename):
    with open(csv_filename, 'r') as f:
        return deque(csv.reader(f), 1)[0]