问题描述
我试图从csv文件返回最后一行。我修改另一个函数,我以前写的返回从文本文件的最后一行。它似乎按照预期工作,但现在当我调用的函数,它抛出一个错误。
reader.seek(0,os.SEEK_END)
AttributeError:'_csv.reader'object没有属性' seek'
import os
import csv
def getLastFile(filename):
distance = 1024
open(filename,'rb')as f:
reader = csv。 reader(f)
reader.seek(0,os.SEEK_END)
如果reader.tell()<距离:
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这种方式,也许我错了吗?谢谢!
这里有一个略微变化的核心概念在接受的答案适用于您的问题的变化。由于每行可能有不同的长度,因此无需读取整个文件。
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
更新
使用 deque
更简单,更快的方法。我从这个问题的答案之一得到了想法。
从集合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]
除了IndexError:#空文件
lastrow = None
return lastrow
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? Thank you!
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 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 by python.
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
这篇关于从csv文件读取最后一行Python错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!