我试图解析一个文件,其中有一个始终存在的部分,而过去的部分是可选的。
for line in finp:
# This part is always present
for _ in range(int(ldata[2])):
sdata = finp.readline()
tdos.write(sdata)
#This part may or may not be present
for i in range(int(atoms)):
next(finp)
for j in range(int(ldata[2])):
aatom[i][j] = [float(x) for x in
finp.readline().strip().split()]问题是,如果不存在可选部分,则next(finp)将产生错误:
next(finp)
StopIteration我试过:
for i in range(int(atoms)):
if i is not None:
next(finp)
for j in range(int(ldata[2])):
aatom[i][j] = [float(x) for x in
finp.readline().strip().split()]
else:
break但这并不能解决问题。我发现以前有很多类似this这样的问题,但无法解决这个问题。
正如公认的ans中所述,解决这个问题的唯一方法是一次读取整个文件,然后进行处理吗?
发布于 2016-07-08 08:34:14
让next()默认返回:
next(finp, None)当给定第二个参数时,next()将捕获一个StopIteration异常并返回第二个参数。
另一种方法是自己捕获StopIteration;也许您希望在这一点上脱离循环:
try:
next(finp)
except StopIteration:
break请注意,您还混合了file.readline()和next(file)。由于Python 2中的实现细节,您将遇到意外的行为,因为这两种方法不共享它们的缓存。坚持在这里使用next() (因为for循环也将file作为迭代器对待)。请参阅http://docs.python.org/2/library/stdtypes.html#file.next文档:
为了使for循环成为遍历文件行的最有效方法(一种非常常见的操作),
next()方法使用隐藏的预读缓冲区。由于使用预读缓冲区,将next()与其他文件方法(如readline())组合起来并不正确。但是,使用seek()将文件重新定位到绝对位置将刷新预读缓冲区.
如果您正在使用Python 3,您可以忽略此警告,但最好还是坚持使用这两种方法之一。
https://stackoverflow.com/questions/38262230
复制相似问题