【问题标题】:AttributeError when trying to use seek() to get last row of csv file尝试使用 seek() 获取 csv 文件的最后一行时出现 AttributeError
【发布时间】:2013-11-30 05:34:50
【问题描述】:

我正在尝试从 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

有人可以帮我修改我的代码吗?我很确定你可以这样使用 seek,也许我弄错了?

【问题讨论】:

  • 你能给我们提供 csv 文件吗?
  • 据我所知,您可以在file 对象上使用seektell,但不能在csv.reader 对象上使用。我不确定是否有与csv.reader 结合使用的好方法。
  • 我刚刚制作了一个 .csv 小文件,其中 20 行左右和 5 列填充了随机数。该代码(我相信)应该与通用 .csv 文件一起使用,返回最后一行,所以我不确定如果我发布它会有所帮助,但如果你愿意,我可以。谢谢!
  • 该死,真令人沮丧!
  • 我不认为这是重复的 - 目标是指“我如何告诉我在最后一行” - 这个问题是“我如何得到最后一行”.. . 它们不是同义词...

标签: python csv seek


【解决方案1】:

这是对问题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

【讨论】:

    【解决方案2】:

    csv阅读器不支持seek,所以你可以将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())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 2019-09-12
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      相关资源
      最近更新 更多