有几种方法可以做到这一点:
df.tail
nrows
参数来阅读skiprows
并读取所需的行数。可以用更简单的方式完成吗?如果不是,应该优先选择这三者中的哪一个?为什么?
可能相关:
答案 0 :(得分:19)
我认为pandas不会在read_csv
中提供一种方法。
也许最好的(一次通过)是使用collections.deque
:
from collections import deque
from StringIO import StringIO
with open(fname, 'r') as f:
q = deque(f, 2) # replace 2 with n (lines read at the end)
In [12]: q
Out[12]: deque(['7,8,9\n', '10,11,12'], maxlen=2)
# these are the last two lines of my csv
In [13]: pd.read_csv(StringIO(''.join(q)), header=None)
值得尝试的另一个选择是get the number of lines in a first pass,然后再次读取文件,使用read_csv
跳过该行数(减去n)...
答案 1 :(得分:6)
文件只是字节流。线不作为单独的实体存在;它们是将某些字节视为换行符的工件。因此,必须从文件的开头读取以按顺序标识行。
如果文件没有经常更改并且这是您需要经常执行的操作(例如,使用n
的不同值),则可以在一秒钟内存储换行符的字节偏移量文件。您可以使用这个小得多的文件和seek
命令快速跳转到第一个文件中的给定行并从那里读取。
(某些操作系统提供面向记录的文件,其内部结构比普通平面文件更复杂。以上内容不适用于它们。)
答案 2 :(得分:3)
这是一个方便的方法。适合我喜欢做的事情 -
import tailer as tl
import pandas as pd
import io
file = open(fname)
lastLines = tl.tail(file,15) #to read last 15 lines, change it to any value.
file.close()
df=pd.read_csv(io.StringIO('\n'.join(lastLines)), header=None)
答案 3 :(得分:0)
由于您正在考虑反转文件,因此我认为可以创建新文件。
tail -n original.csv > temp.csv
head -1 original.csv | cat - temp.csv > newfile.csv && rm -f temp.csv