Python 试图使用seek()获取csv文件的最后一行时出现AttributeError

Python 试图使用seek()获取csv文件的最后一行时出现AttributeError,python,csv,seek,Python,Csv,Seek,我正在尝试从csv文件返回最后一行。我正在修改之前编写的另一个函数,该函数返回文本文件的最后一行。一开始它似乎像预期的那样工作,但现在当我调用该函数时,它抛出了一个错误 reader.seek(0, os.SEEK_END) AttributeError:“\u csv.reader”对象没有属性“seek” 导入操作系统 导入csv def getLastFile(文件名): 距离=1024 将open(filename,'rb')作为f: 读卡器=csv。读卡器(f) reader.s

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

reader.seek(0, os.SEEK_END)
AttributeError:“\u csv.reader”对象没有属性“seek”

导入操作系统
导入csv
def getLastFile(文件名):
距离=1024
将open(filename,'rb')作为f:
读卡器=csv。读卡器(f)
reader.seek(0,操作系统seek\u结束)
如果读卡器.tell()<距离:
reader.seek(0,操作系统seek_集)
lines=reader.readlines()
lastline=行[-1]
其他:
reader.seek(-1*距离,操作系统seek\u结束)
lines=reader.readlines()
lastline=行[-1]
返回最后一行

有人能帮我修改代码吗?我很确定你可以用这种方式来使用seek,也许我弄错了?

这是一个核心概念的细微变化,在你对问题的变化所接受的答案中。由于每一行的长度可能不同,因此实际上没有办法读取整个文件

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
更新

这里有一种更简单、可能更快的方法,可以使用。我从这个问题的一个答案中得到了这个想法


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())

你能给我们csv文件吗?你可以在
文件
对象上
seek
tell
,但在
csv.reader
对象上就我所知,你不能。我不确定是否有一个好方法可以与
csv.reader
结合使用。我只是制作了一个小的.csv文件,其中有20行左右,5列填充了随机数。代码(我相信)应该与一个通用的.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]
import csv

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