我有一个文件,其中使用分隔符.
分隔行。我想逐行阅读这个文件,其中的行应该基于.
而不是换行符。
一种方法是:
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。
有没有办法有效地读取文件行但是基于预先指定的分隔符?
答案 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):
...