我正在尝试从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
有人可以帮我修改我的代码吗?我很确定你可以用这种方式使用搜索,也许我错了?
答案 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())