AttributeError when trying to use seek() to get last row of csv file

半城伤御伤魂 提交于 2019-11-28 04:38:26

问题


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?


回答1:


Here's a slight variation of the core concept in the accepted answer to the question 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:
        lastrow = None
        for lastrow in csv.reader(f): pass
        return lastrow

Update

Here's a simpler and likely faster way to do it using a collections.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.

from collections import deque
import csv

def get_last_row(csv_filename):
    with open(csv_filename, 'r') as f:
        try:
            lastrow = deque(csv.reader(f), 1)[0]
        except IndexError:  # empty file
            lastrow = None
        return lastrow



回答2:


csv reader not support seek, so you can get csv file last line as text file, then process last line as csv. In your code, if last line length > distance, then will get only part of last line.

import os

def get_last_line(fin):
    line_len = 80
    fin.seek(0, os.SEEK_END)
    file_size = fin.tell()
    while True:
        line_len = min(line_len * 2, file_size)
        fin.seek(-line_len, os.SEEK_END)
        lines = f.readlines()
        if len(lines) > 1 or line_len == file_size:
            return lines[-1]

then read csv:

import csv

print ', '.join(csv.reader([last_line]).next())


来源:https://stackoverflow.com/questions/20296955/attributeerror-when-trying-to-use-seek-to-get-last-row-of-csv-file

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!