【问题标题】:python 'str' object has no attribute 'items'python'str'对象没有属性'items'
【发布时间】:2021-02-13 05:24:36
【问题描述】:

我试图循环包含字典的 txt 文件
我的代码将其作为字符串读取也尝试将这些 txt 文件更改为 json,但由于这些单词是单引号,所以它说:
期望用双引号括起来的属性名称
代码

for jfile in file_txt.glob('*.txt')            
      with jfile.open('r') as ifile:
          lines_dict=ifile.read()
          for page, word in lines_dict.items():
                    lines = convert_text_to_lines(word)

错误

    for page, word in lines_dict.items():
AttributeError: 'str' object has no attribute 'items'

我的 txt 文件示例

{1: [((86, 27, 168, 50), 'haha'), ((85, 53, 195, 63), ' work for you.'), ((323, 49, 408, 57),       'Total  due'), ((534, 42, 590, 59), '4.10'), ((323, 66, 515, 77), ' do not need to make')}

【问题讨论】:

  • 文件包含的是一个字典的字符串表示 - 不是一个实际的字典。这有点像看一本书的图片——你不能翻页,但你可以用图片找到真正的书。在您的情况下,您必须首先将文件内容转换回实际的字典,例如通过ast.literal_eval.
  • 这是您文件的实际内容吗?你确定没有,比如说,在结尾处没有结尾的] 吗?

标签: python json python-3.x dictionary


【解决方案1】:

在您的情况下,lines_dict 的类型为 str 而不是 dict,这就是您无法解压它的原因。因此请使用 ast 模块中的 literal_eval 方法。

签名解决方案已发布

import glob
import ast
for jfile in glob.glob('*.txt'):
      print(jfile)
      with open(jfile,'r') as ifile:
          lines_dict=ast.literal_eval(ifile.read())
          for page, word in lines_dict.items():
                    lines = convert_text_to_lines(word)

【讨论】:

    【解决方案2】:

    问题是read() 返回一个字符串,而字符串不像字典那样有任何属性“items”。建议使用readlines() 的另一个答案也是不正确的,因为那只会返回一个列表。 (编辑:看起来答案已被删除,但仍然如此)。

    两件事:

    1. 我假设您错误地复制了文本数据,最后缺少一个 ] 括号。

    2) json.load() 如果您的数据使用双引号而不是单引号,这将是一个很好的解决方案。 结果即使数据有双引号、整数键和元组会是宫城先生在 cmets 中指出的问题。


    无论如何,一种解决方法是使用 ast.literal_eval()(这比原始 eval 更安全)

    for jfile in file_txt.glob('*.txt'):        
        with jfile.open('r') as ifile:   
            lines_dict=ast.literal_eval(ifile.read())
    

    对于 eval 与 ast.literal_val,请参阅 here

    【讨论】:

    • 请避免暗示 Python 表示法“几乎”是 JSON。人们会得到错误的印象,并试图将一种转换为另一种。与“您的数据是否使用双引号而不是单引号”相比,差异要大得多。即使只是在显示的示例中,JSON 也会阻塞整数键和元组。
    【解决方案3】:

    如果文本文件包含 JSON 对象,那么将其转换为 Python 字典的一种方法是使用 json 模块:

    import json 
    
    for jfile in file_txt.glob('*.txt')            
          with jfile.open('r') as ifile:
              lines_dict=json.load(ifile)
    

    问题是txt文件的样本不是JSON对象。在 JSON 格式中,键必须是用双引号括起来的字符串,但在示例中,第一个键是整数 1。作为值的字符串也需要用双引号括起来,但在示例中它们用单引号括起来,例如'haha'。此外,JSON 无法识别元组。此外,在示例中,在最后一个大括号之前缺少一个右方括号。如果最后一个问题得到解决,则可以使用 eval 函数将字符串转换为 Python 字典,但这带有 usual risks

    for jfile in file_txt.glob('*.txt')            
          with jfile.open('r') as ifile:
              lines_dict = eval(ifile.read())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-14
      • 2013-09-22
      • 1970-01-01
      • 2015-09-30
      • 2020-09-22
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多