获取csv文件的最后10000行

Ana*_*ory 5 python csv tail pandas

在pandas中,我可以pandas.io.parser.read_csv("file.csv", nrows=10000)用来获取csv文件的前10000行.

但是因为我的csv文件很大,并且最后一行比第一行更有意义,所以我想阅读最后10000行.但是,即使我知道文件的长度,这也不是那么容易,因为如果我使用pandas.io.parser.read_csv("file.csv", nrows=10000, skiprows=990000)包含文件头的第一行跳过1000000行csv文件的前990000行,也会被跳过.(header=0skiprows应用之后进行测量,因此它也没有帮助.)

如何从第0行中带有标题的csv文件中获取最后10000行,最好不知道行中文件的长度?

Ant*_*pov 5

您可以先使用以下方法计算文件大小:

size = sum(1 for l in open('file.csv'))
Run Code Online (Sandbox Code Playgroud)

然后使用skiprows具有range:

df = pd.read_csv('file.csv', skiprows=range(1, size - 10000))
Run Code Online (Sandbox Code Playgroud)

编辑

正如@ivan_pozdeev提到的解决方案,你需要通过文件两次.我试图用pandas读取整个文件,然后使用tail方法,但这个方法比较慢,然后建议.

示例数据帧:

pd.DataFrame(np.random.randn(1000000,3), columns=list('abc')).to_csv('file.csv')
Run Code Online (Sandbox Code Playgroud)

定时

def f1():
    size = sum(1 for l in open('file.csv'))
    return pd.read_csv('file.csv', skiprows=range(1, size - 10000))

def f2():
    return pd.read_csv('file.csv').tail(10000)

In [10]: %timeit f1()
1 loop, best of 3: 1.8 s per loop

In [11]: %timeit f2()
1 loop, best of 3: 1.94 s per loop
Run Code Online (Sandbox Code Playgroud)

  • 我推测,使用`tail`,你首先将_all_数据读入`DataFrame`,然后进行切片.这不仅速度慢,而且还有内存耗尽的风险. (2认同)