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

时间:2017-04-21 16:25:43

标签: python file-handling

我有一个大文本文件(超过我的RAM),我需要使用它中的每一行进行进一步处理。但是,如果我一次读到4096字节的话,我担心在两者之间将线分开。我该怎么办?

4 个答案:

答案 0 :(得分:3)

以下是您可以做的事情:

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)
  1. 如果您执行data.splitlines(True),则新结果字符将保留在结果列表中。

答案 1 :(得分:2)

使用生成器读取文件:

background:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' 
xmlns:xlink='http://www.w3.org/1999/xlink' width='180' height='118' 
fill='white'><path d='M90,14 143,108H37z' stroke-width='11' 
stroke='red'/><g id='cr'><path d='M70,68 73,59H90L93,68' stroke-width='2' 
stroke='black'/><path d='M67,70H93V74H67M71,74V81M92,74V81' stroke-
width='5' stroke='black'/></g><use x='13' y='8' xlink:href='#cr'/><use 
x='26' y='16' xlink:href='#cr'/></svg>")

这样你一次在内存中永远不会有多行,但仍然会按顺序读取文件。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

在linux上:

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

import sys

for line in sys.stdin:
    #do something with the line, for example:
    output = line[:5] + line[10:15]
    sys.stdout.write("{}\n".format(output))

运行脚本,使用:

cat input_data | python process.py > output