首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优雅地退出EOF

优雅地退出EOF
EN

Stack Overflow用户
提问于 2016-07-08 08:32:34
回答 1查看 826关注 0票数 3

我试图解析一个文件,其中有一个始终存在的部分,而过去的部分是可选的。

代码语言:javascript
复制
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)将产生错误:

代码语言:javascript
复制
    next(finp)
StopIteration

我试过:

代码语言:javascript
复制
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中所述,解决这个问题的唯一方法是一次读取整个文件,然后进行处理吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-08 08:34:14

next()默认返回:

代码语言:javascript
复制
next(finp, None)

当给定第二个参数时,next()将捕获一个StopIteration异常并返回第二个参数。

另一种方法是自己捕获StopIteration;也许您希望在这一点上脱离循环:

代码语言:javascript
复制
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,您可以忽略此警告,但最好还是坚持使用这两种方法之一。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38262230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档