当前位置: 首页 > 知识库问答 >
问题:

如何快速获取一个巨大的csv文件(48M行)的最后一行?

魏鹤轩
2023-03-14

我有一个csv文件,它一直增长到大约48M行。

在向它添加新行之前,我需要阅读最后一行。

我尝试了下面的代码,但它太慢了,我需要一个更快的替代方案:

def return_last_line(filepath):    
    with open(filepath,'r') as file:        
        for x in file:
            pass
        return x        
return_last_line('lala.csv')

共有1个答案

有凯泽
2023-03-14

这通常是一件相当棘手的事情。获得包含最后一行的块的一种非常有效的方法如下:

import os


def get_last_lines(path, offset=500):
    """ An efficient way to get the last lines of a file.

    IMPORTANT: 
    1. Choose offset to be greater than 
    max_line_length * number of lines that you want to recover.
    2. This will throw an os.OSError if the file is shorter than
    the offset.
    """
    with path.open("rb") as f:
        f.seek(-offset, os.SEEK_END)
        while f.read(1) != b"\n":
            f.seek(-2, os.SEEK_CUR)
        return f.readlines()

您需要知道最大的行长度,但确保文件至少是一个偏移量长!

要使用它,请执行以下操作:

from pathlib import Path


n_last_lines = 10
last_bit_of_file = get_last_lines(Path("/path/to/my/file"))
real_last_n_lines = last_bit_of_file[-10:]

现在,您需要将二进制文件解码为字符串:

real_last_n_lines_non_binary = [x.decode() for x in real_last_n_lines]

可能所有这些都可以用一个更方便的函数来包装。

 类似资料:
  • 我的问题是: > 如何使其与较大的文件一起工作? 有什么办法能让它快一点吗? 我的电脑有8GB的RAM,运行64位Windows 7,处理器是3.40GHz(不确定你需要什么信息)。

  • 问题内容: 我想读取一个非常大的文件的最后n行,而不使用Java将整个文件读入任何缓冲区/内存区域。 我环顾了JDK API和Apache Commons I / O,但无法找到适合此目的的一个。 我在想UNIX中使用tail或更少的方式。我认为他们不会加载整个文件,然后显示文件的最后几行。在Java中也应该有类似的方法。 问题答案: 如果使用,则可以使用和到达文件末尾附近的特定点,然后从那里开始

  • 我想用Java读取一个巨大的文件。它包括75,000,000条线路。问题是,即使我使用的是最大和限制,但我得到的是:`java.lang.OutOfMemoryError(GC开销限制已超过),它显示这一行导致错误: 我做了一些测试,看到我能很好地阅读15,000,000行。因此我开始使用这种代码: 这里,它很好地写出了第一个15,000,000行,但是在第二个试验中,这再次给出了相同的错误,尽管

  • 问题内容: 我目前正在尝试从Python 2.7中的.csv文件中读取数据,该文件最多包含100万行和200列(文件范围从100mb到1.6gb)。对于少于300,000行的文件,我可以(非常缓慢地)执行此操作,但是一旦超过该行,就会出现内存错误。我的代码如下所示: 在getstuff函数中使用else子句的原因是,所有符合条件的元素都将一起列在csv文件中,因此当我经过它们时,为了节省时间,我离

  • 问题内容: 从Java中的[非常大]文件中读取文本的最后一行的最快,最有效的方法是什么? 问题答案: 以下是两个函数,一个函数返回文件的最后一个非空白行而不加载或单步浏览整个文件,另一个函数返回文件的最后N行而不单步浏览整个文件: 尾部的作用是直接缩放到文件的最后一个字符,然后逐个字符向后退一步,记录所看到的内容,直到找到换行符为止。找到换行符后,便会跳出循环。反转记录的内容,并将其放入字符串中并

  • 问题内容: 我必须编写一个PHP脚本,该脚本将从给定的CSV文件中将数据导入MySQL数据库。给定的CSV文件最多可以包含200,000行。我尝试了以下方法,但出现了问题: LOAD DATA LOCAL INFILE:我不能使用LOAD DATA LOCAL INFILE语句,因为我想在上载行之前先进行一些验证,而且,我们的数据库管理员不希望我使用该语句,我也不知道为什么。 FOR LOOP:在