读取具有指定分隔符的文件以换行

时间:2013-04-28 05:51:22

标签: python file-io python-2.7 io

我有一个文件,其中使用分隔符.分隔行。我想逐行阅读这个文件,其中的行应该基于.而不是换行符。

一种方法是:

f = open('file','r')
for line in f.read().strip().split('.'):
   #....do some work
f.close()

但如果我的文件太大,这不是内存效率。我没有一起阅读整个文件,而是想逐行阅读。

open支持参数'newline',但此参数仅需None, '', '\n', '\r', and '\r\n'作为输入here

有没有办法有效地读取文件行但是基于预先指定的分隔符?

3 个答案:

答案 0 :(得分:20)

您可以使用生成器:

def myreadlines(f, newline):
  buf = ""
  while True:
    while newline in buf:
      pos = buf.index(newline)
      yield buf[:pos]
      buf = buf[pos + len(newline):]
    chunk = f.read(4096)
    if not chunk:
      yield buf
      break
    buf += chunk

with open('file') as f:
  for line in myreadlines(f, "."):
    print line

答案 1 :(得分:2)

最简单的方法是预处理文件以生成所需的换行符。

以下是使用perl的示例(假设您希望字符串'abc'为换行符):

perl -pe 's/abc/\n/g' text.txt > processed_text.txt

如果您还想忽略原始换行符,请改用以下内容:

perl -ne 's/\n//; s/abc/\n/g; print' text.txt > processed_text.txt

答案 2 :(得分:1)

使用我用来解析PDF文件的ggplot(mtcars) + geom_boxplot(aes(cyl, hp, fill = as.character(gear))) + geom_boxplot(aes(cyl, disp, color = as.character(cyl))) + labs(fill = 'fill', color = 'color') + guides(fill = guide_legend(order=1), color = guide_legend(order=2)) FileIO,这是一个更有效的答案-

bytearray

以上示例还处理了自定义EOF。如果您不想要,请使用此:

import io
import re


# the end-of-line chars, separated by a `|` (logical OR)
EOL_REGEX = b'\r\n|\r|\n'  

# the end-of-file char
EOF = b'%%EOF'



def readlines(fio):
    buf = bytearray(4096)
    while True:
        fio.readinto(buf)
        try:
            yield buf[: buf.index(EOF)]
        except ValueError:
            pass
        else:
            break
        for line in re.split(EOL_REGEX, buf):
            yield line


with io.FileIO("test.pdf") as fio:
    for line in readlines(fio):
        ...