gpt4 book ai didi

python - 使用 numpy/pandas 在 Python 中读取 CSV 文件的最后 N 行

转载 作者:太空宇宙 更新时间:2023-11-03 12:27:09 26 4
gpt4 key购买 nike

有没有一种使用 numpypandas 在 Python 中读取 CSV 文件的最后 N 行的快速方法?

  1. 我不能在 numpy 中执行 skip_header 或在 pandas 中执行 skiprow 因为文件的长度各不相同,我总是需要最后 N 行。

  2. 我知道我可以使用纯 Python 从文件的最后一行开始逐行读取,但那样会很慢。如果必须的话,我可以做到这一点,但非常感谢使用 numpypandas(本质上是使用 C)的更有效方法。

    <

最佳答案

对于一个 10 行的小测试文件,我尝试了 2 种方法 - 解析整个文件并选择最后 N 行,与加载所有行,但只解析最后 N 行:

In [1025]: timeit np.genfromtxt('stack38704949.txt',delimiter=',')[-5:]
1000 loops, best of 3: 741 µs per loop

In [1026]: %%timeit
...: with open('stack38704949.txt','rb') as f:
...: lines = f.readlines()
...: np.genfromtxt(lines[-5:],delimiter=',')

1000 loops, best of 3: 378 µs per loop

这被标记为 Efficiently Read last 'n' rows of CSV into DataFrame 的副本.那里接受的答案使用

from collections import deque

并收集了该结构中的最后 N 行。它还使用 StringIO 将行提供给解析器,这是不必要的复杂化。 genfromtxt 从任何给它行的东西中获取输入,所以行列表就可以了。

In [1031]: %%timeit 
...: with open('stack38704949.txt','rb') as f:
...: lines = deque(f,5)
...: np.genfromtxt(lines,delimiter=',')

1000 loops, best of 3: 382 µs per loop

基本上与readlines和slice同步。

deque 在文件非常大时可能有优势,并且卡在所有行上的成本很高。我认为它不会节省任何文件阅读时间。仍然需要一行一行地阅读。

row_count 后跟 skip_header 方法的时间较慢;它需要读取文件两次。 skip_header 仍然需要读取行。

In [1046]: %%timeit 
...: with open('stack38704949.txt',"r") as f:
...: ...: reader = csv.reader(f,delimiter = ",")
...: ...: data = list(reader)
...: ...: row_count = len(data)
...: np.genfromtxt('stack38704949.txt',skip_header=row_count-5,delimiter=',')

The slowest run took 5.96 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 760 µs per loop

为了计算行数,我们不需要使用 csv.reader,尽管它似乎不会花费太多额外时间。

In [1048]: %%timeit 
...: with open('stack38704949.txt',"r") as f:
...: lines=f.readlines()
...: row_count = len(data)
...: np.genfromtxt('stack38704949.txt',skip_header=row_count-5,delimiter=',')

1000 loops, best of 3: 736 µs per loop

关于python - 使用 numpy/pandas 在 Python 中读取 CSV 文件的最后 N 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38704949/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com