Python 我需要拆分一个非常大的文本文件

Python 我需要拆分一个非常大的文本文件,python,file-handling,Python,File Handling,我有一个大的文本文件(比我的RAM还多),我需要使用其中的每一行进行进一步处理​. 但是如果我一次读4096个字节,我会担心在这两者之间的某个地方分线。我该怎么做呢?人们在音频编码区做这类事情,那里的文件可能很大。据我所知,正常的方法是使用内存缓冲区,分两个阶段进行:将任意大小的blob读入缓冲区(4096或其他),然后从缓冲区中流式传输字符,并对行尾作出反应。因为缓冲区在ram中,所以从中逐字流式输出很快。我不确定在Python中使用什么样的数据结构或调用是最好的,但实际上我只在C中使用过,在

我有一个大的文本文件(比我的RAM还多),我需要使用其中的每一行进行进一步处理​. 但是如果我一次读4096个字节,我会担心在这两者之间的某个地方分线。我该怎么做呢?

人们在音频编码区做这类事情,那里的文件可能很大。据我所知,正常的方法是使用内存缓冲区,分两个阶段进行:将任意大小的blob读入缓冲区(4096或其他),然后从缓冲区中流式传输字符,并对行尾作出反应。因为缓冲区在ram中,所以从中逐字流式输出很快。我不确定在Python中使用什么样的数据结构或调用是最好的,但实际上我只在C中使用过,在C中它只是一块ram。但同样的方法也应该有效。

使用生成器读取文件:

def read_file(file_path):
    with open(file_path, 'r') as lines:
        for line in lines:
            yield line

这样一来,您的内存中一次不会超过一行,但仍会按顺序读取文件。

以下是您可以执行的操作:

SIZE = 1024

with open('file.txt') as f:
    old, data = '', f.read(SIZE)

    while data:
          # (1)
        lines = data.splitlines()
        if not data.endswith('\n'):
            old = lines[-1]
        else:
            old = ''

        # process stuff

        data = old + f.read(SIZE)
  • 如果执行
    data.splitlines(True)
    ,则结果列表中将保留新行字符 在linux上:

    将其放入python脚本中,例如process.py:

    要运行脚本,请使用:

    cat input_data | python process.py > output
    

    您可以一次读取一个字符,直到偶然发现一个新行字符(
    \n
    \r\n
    ),然后在新行之前将数据写入另一个文件。这会不会使处理速度慢很多?或者分块读取数据并扫描新行,然后查看数据块是否以新行结束。如果没有,并且需要从文件中读取更多数据,则执行此操作并将新块与前一块的其余部分连接起来。然后重复此过程。是否有一些行超出了您可以用于此任务的内存大小?如果是文本文件,请一次读取一行,将每行添加到列表中。通过将每个字符的长度添加到累加器中,您可以跟踪已读取的字符数,但请事先检查是否需要处理“块”.我担心哪怕只有一行会超出我的内存…我甚至无法正常打开文件进行检查…尽管如此…这是一个很好的解决方案,如果我确定一行是固定长度的…收益率不会在这里增加任何值。。。{{for line in lines}},调用一个文件迭代器..它已经在内存中逐行加载数据..您可以执行:{{for line in lines:doSomethingWithThisLine()}}函数并熟悉它Hanks…我只是一个初学者,我第一次处理此类卷的数据。。。
    cat input_data | python process.py > output