如何在Python中检查EOF?我在代码中发现了一个错误,其中分隔符后的最后一个文本块未添加到返回列表中。或者也许有更好的方式来表达这个功能?
这是我的代码:
def get_text_blocks(filename):
text_blocks = []
text_block = StringIO.StringIO()
with open(filename, 'r') as f:
for line in f:
text_block.write(line)
print line
if line.startswith('-- -'):
text_blocks.append(text_block.getvalue())
text_block.close()
text_block = StringIO.StringIO()
return text_blocks
答案 0 :(得分:3)
您可能会发现使用itertools.groupby更容易解决此问题。
def get_text_blocks(filename):
import itertools
with open(filename,'r') as f:
groups = itertools.groupby(f, lambda line:line.startswith('-- -'))
return [''.join(lines) for is_separator, lines in groups if not is_separator]
另一种方法是使用regular expression来匹配分隔符:
def get_text_blocks(filename):
import re
seperator = re.compile('^-- -.*', re.M)
with open(filename,'r') as f:
return re.split(seperator, f.read())
答案 1 :(得分:1)
一旦for
语句终止,文件结束条件就会成立 - 这似乎是修改此代码的最简单方法(如果您愿意,可以在最后提取text_block.getvalue()
在附加之前检查它是否为空。)
答案 2 :(得分:1)
这是发射缓冲区的标准问题。
你没有发现EOF - 这是不必要的。你写了最后一个缓冲区。
def get_text_blocks(filename):
text_blocks = []
text_block = StringIO.StringIO()
with open(filename, 'r') as f:
for line in f:
text_block.write(line)
print line
if line.startswith('-- -'):
text_blocks.append(text_block.getvalue())
text_block.close()
text_block = StringIO.StringIO()
### At this moment, you are at EOF
if len(text_block) > 0:
text_blocks.append( text_block.getvalue() )
### Now your final block (if any) is appended.
return text_blocks
答案 3 :(得分:-1)
为什么你需要StringIO?
def get_text_blocks(filename):
text_blocks = [""]
with open(filename, 'r') as f:
for line in f:
if line.startswith('-- -'):
text_blocks.append(line)
else: text_blocks[-1] += line
return text_blocks
编辑:修正了这个功能,其他建议可能会更好,只是想编写一个与原版相似的功能。
编辑:假设文件以“ - - ”开头,通过在列表中添加空字符串可以“修复”IndexError,或者你可以使用这个:
def get_text_blocks(filename):
text_blocks = []
with open(filename, 'r') as f:
for line in f:
if line.startswith('-- -'):
text_blocks.append(line)
else:
if len(text_blocks) != 0:
text_blocks[-1] += line
return text_blocks
但是这两个版本对我来说有点难看,reg-ex版本更清晰。
答案 4 :(得分:-2)
这是查看您是否有空文件的快速方法:
if f.read(1) == '':
print "EOF"
f.close()