【问题标题】:Python "with" statement scope and order of statementsPython“with”语句范围和语句顺序
【发布时间】:2017-05-15 13:49:17
【问题描述】:

好的,我的代码很生疏,所以我一直在借鉴和改编教程。

我开始使用 BeautifulSoup 打开一个文件:

with open('event.html', encoding='utf8') as f:
    soup = bs4.BeautifulSoup(f, "lxml")

后来,我需要在同一个文件中找到一个字符串,而 BS 似乎更复杂,所以我做了:

lines = f.readlines()

并与前面的说明放在一起:

with open('event.html', encoding='utf8') as f:
    soup = bs4.BeautifulSoup(f, "lxml")
    lines = f.readlines()

我感到困惑的是,如果我交换两行并制作如下所示的块:

with open('event.html', encoding='utf8') as f:
    lines = f.readlines()
    soup = bs4.BeautifulSoup(f, "lxml")

然后我的其余代码将中断。为什么会这样?

【问题讨论】:

  • 第一个有效
  • 因为 .readlines() 将文件指针前进到文件末尾所以当 BS 尝试读取指针时,指针位于文件末尾
  • 那么,我应该使用不同/更好的方法来提取线条吗?
  • 您可以根据 user3381590 的回答将指针重置为文件的开头或查看stackoverflow.com/questions/10201008/…
  • 订单对我来说并不重要,但我一直在想为什么代码不起作用,然后当我想出重新订购该部分“修复”它时更加困惑......如果有人有一个建议我会接受的

标签: python


【解决方案1】:

readlines 函数使内部文件指针指向文件末尾。我自己没有使用 BeautifulSoup,但我假设他们假设输入文件指向文件中的第 0 个索引。 使用f.seek(0) 从头开始​​查找文件应该可以缓解这种情况。

with open('event.html', encoding='utf8') as f:
    lines = f.readlines()
    f.seek(0)
    soup = bs4.BeautifulSoup(f, "lxml")

BeautifulSoup 可能正在读取文件,然后在完成读取后将文件指针设置回原来的位置,这就是它以相反方式工作的原因。

【讨论】:

  • 从我的测试来看,我相信 BeautifulSoup 和 readlines() 都没有设置指针。如果另一个先运行,BS 将使脚本崩溃,但 readlines() 将简单地返回空并继续。你的 f.seek(0) 解决了这个问题。谢谢!
  • 如果 BS 没有设置指针,那么在调用 f.readlines 时lines 应该是一个空列表。
猜你喜欢
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 2015-01-16
相关资源
最近更新 更多