尝试使用seek()获取csv文件的最后一行时的AttributeError

时间:2013-11-30 05:34:50

标签: python csv seek

我正在尝试从csv文件返回最后一行。我正在修改我之前写的另一个函数,它返回文本文件的最后一行。它似乎首先按预期工作,但现在当我调用该函数时,它会抛出一个错误。

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

有人可以帮我修改我的代码吗?我很确定你可以用这种方式使用搜索,也许我错了?

2 个答案:

答案 0 :(得分:11)

以下是对您的问题变体应用问题Have csv.reader tell when it is on the last line的已接受答案中的核心概念的略微变化。由于每一行的长度可能不同,因此无需读取整个文件。

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

<强>更新

使用collections.deque这是一种更简单,更快捷的方式。我从问题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

答案 1 :(得分:0)

csv阅读器不支持搜索,因此您可以将csv文件的最后一行作为文本文件,然后将最后一行作为csv处理。 在您的代码中,如果最后一行长度>距离,然后只会得到最后一行的一部分。

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]

然后阅读csv:

import csv

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