我试图在包含字典的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_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)
问题是read()
返回一个字符串,而字符串不像字典那样有任何属性'items'。建议使用readlines()
的另一个答案也是不正确的,因为这只会返回一个列表。(编辑:看起来答案被删除了,但不管怎样)。
两件事:
- 我假设你错误地复制了你的文本数据,在末尾缺少一个[括号。
2)如果你的数据使用双引号而不是单引号,事实证明,即使数据有双引号,整数键和元组也会像MisterMiyagi在评论中指出的那样出现问题。json.load()
将是一个很好的解决方案。
无论如何,一种解决方法是使用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())