【问题标题】:Access values outside with-block访问 with-block 之外的值
【发布时间】:2020-08-12 14:17:04
【问题描述】:

在下面的代码中,有没有办法在with-block 之外访问变量utterances_dict?下面的代码显然会返回错误:ValueError: I/O operation on closed file.

from csv import DictReader

utterances_dict = {}
utterance_file = 'toy_utterances.csv'

with open(utterance_file, 'r') as utt_f:
    utterances_dict = DictReader(utt_f)

for line in utterances_dict:
    print(line)

【问题讨论】:

  • 为什么要在外面使用?只需将您的 for 循环放入 with 结构中即可?
  • 我知道在这种情况下该怎么做。但实际的方案更加多元化
  • 这不行吗?:定义一个函数,在该函数中使用 with 然后返回你想要的,使用返回的数据
  • @Ruli - 这可行;我会玩弄那个。谢谢。

标签: python with-statement


【解决方案1】:

我不是DictReader 实现方面的专家,但是their documentation 将实现留给读者自己在构建后解析文件。这意味着在您完成使用之前,基础文件可能必须保持打开状态。在这种情况下,尝试在 with 块之外使用 utterances_dict 会出现问题,因为届时底层文件将被关闭。

即使DictReader 的当前实现确实在构建时解析了整个 csv,但这并不意味着它们的实现在未来不会改变。

【讨论】:

    【解决方案2】:

    DictReader 返回 csv 文件的视图。

    将结果转换为字典列表。

    from csv import DictReader
    
    utterances = []
    utterance_file = 'toy_utterances.csv'
    
    with open(utterance_file, 'r') as utt_f:
        utterances = [dict(row) for row in DictReader(utt_f) ]
    
    for line in utterances:
        print(line)
    

    【讨论】:

      猜你喜欢
      • 2021-07-02
      • 2021-01-25
      • 2014-03-30
      • 2011-10-30
      • 1970-01-01
      • 2019-04-29
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多