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