Python 'str'对象没有属性'items'



我试图在包含字典的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')}

在您的情况下,lines_dictstr类型,而不是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)

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

两件事:

  1. 我假设你错误地复制了你的文本数据,在末尾缺少一个[括号。

2)如果你的数据使用双引号而不是单引号,json.load()将是一个很好的解决方案。事实证明,即使数据有双引号,整数键和元组也会像MisterMiyagi在评论中指出的那样出现问题。


无论如何,一种解决方法是使用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,请参见此处

如果文本文件包含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字典,但这存在通常的风险:

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

相关内容

  • 没有找到相关文章