python';str';对象没有属性';项目';
我试图在包含字典的txt文件上循环python';str';对象没有属性';项目';,python,json,python-3.x,dictionary,Python,Json,Python 3.x,Dictionary,我试图在包含字典的txt文件上循环我的代码将其读取为字符串,也尝试将这些txt文件更改为json,但由于这些单词在单引号中,因此它会说: 应使用双引号括起属性名 代码 错误 我的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,
我的代码将其读取为字符串,也尝试将这些txt文件更改为json,但由于这些单词在单引号中,因此它会说:
应使用双引号括起属性名
代码 错误 我的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')}
问题是
read()
返回一个字符串,并且字符串没有任何与字典不同的属性“items”。另一个建议使用readlines()
的答案也不正确,因为这只会返回一个列表。
(编辑:看起来答案已被删除,但仍然如此)
两件事:json.load()
如果您的数据使用双引号而不是单引号,将是一个很好的解决方案。事实证明,即使数据有双引号,整数键和元组也会像MisterMiyagi在评论中指出的那样成为一个问题
无论如何,一个解决方法是使用
ast.literal\u eval()
(这比原始eval安全一点)
有关eval与ast.literal\u val的比较,请参见在您的案例中
line\u dict
属于str
类型,而不是dict
,这就是您无法解压缩它的原因。因此,请使用ast
模块中的literal\u 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)
如果文本文件将包含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字典,但这会带来:
该文件包含的是一个dict的字符串表示形式,而不是实际的dict。这有点像看一本书的图片——你不能翻页,但你可以使用图片找到真正的书。在您的情况下,您必须首先将文件内容转换回实际的dict,例如通过
ast.literal\u eval
。这是您文件的实际内容吗?你确定结尾附近没有遗漏结尾的]
吗?请避免暗示Python符号是“几乎”JSON。人们会得到错误的印象,并试图将其中一个转变为另一个。区别远不止“你的数据使用了双引号而不是单引号”。即使只是在所示的示例中,JSON也会阻塞整数键和元组
for jfile in file_txt.glob('*.txt'):
with jfile.open('r') as ifile:
lines_dict=ast.literal_eval(ifile.read())
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)
import json
for jfile in file_txt.glob('*.txt')
with jfile.open('r') as ifile:
lines_dict=json.load(ifile)
for jfile in file_txt.glob('*.txt')
with jfile.open('r') as ifile:
lines_dict = eval(ifile.read())