在python中创建有效的json对象
每一行都是有效的JSON,但我需要整个文件都是有效的JSON 我有一些从web服务聚合并转储到文件的数据,因此它是JSON eaque,但不是有效的JSON,因此无法以JSON文件所能提供的简单直观的方式处理它-因此构成了一个主要的难题,它看起来(或多或少)像这样:在python中创建有效的json对象,python,json,Python,Json,每一行都是有效的JSON,但我需要整个文件都是有效的JSON 我有一些从web服务聚合并转储到文件的数据,因此它是JSON eaque,但不是有效的JSON,因此无法以JSON文件所能提供的简单直观的方式处理它-因此构成了一个主要的难题,它看起来(或多或少)像这样: {"record":"value0","block":"0x79"} {"record":"value1","block":"0x80"} 我一直试图将其重新解释为有效的JSON,我最近的尝试如下所示: with open('
{"record":"value0","block":"0x79"}
{"record":"value1","block":"0x80"}
我一直试图将其重新解释为有效的JSON,我最近的尝试如下所示:
with open('toy.json') as inpt:
lines = []
for line in inpt:
if line.startswith('{'): # block starts
lines.append(line)
然而,正如你可能从我提出这个问题的事实中推断出来的那样——这是行不通的——关于我如何解决这个问题,你有什么想法吗
编辑:
我试过这个:
with open('toy_two.json', 'rb') as inpt:
lines = [json.loads(line) for line in inpt]
print(lines['record'])
但出现以下错误:
Traceback (most recent call last):
File "json-ifier.py", line 38, in <module>
print(lines['record'])
TypeError: list indices must be integers, not str
每一行看起来都像一个有效的JSON文档 这是“JSON行”格式() 尝试独立地处理每一行(
json.loads(line)
)或使用专门的库()
每一行看起来都像一个有效的JSON文档 这是“JSON行”格式() 尝试独立地处理每一行(
json.loads(line)
)或使用专门的库()
这看起来像我最近使用的NDJSON。该规范是有效的,我不确定它是否有用。下面的方法有效吗
with open('the file.json', 'rb') as infile:
data = infile.readlines()
data = [json.loads(item.replace('\n', '')) for item in data]
这应该会给你一个字典列表。这看起来像是我最近使用的NDJSON。该规范是有效的,我不确定它是否有用。下面的方法有效吗
with open('the file.json', 'rb') as infile:
data = infile.readlines()
data = [json.loads(item.replace('\n', '')) for item in data]
这会给你一个字典列表。每一行都是有效的JSON吗?例如:
lines=[json.loads(line)for line in inpt]
做这项工作吗?lines.append(json.loads(line))
?是的,但我不想处理每一行-我想处理整个文件-真正的一行有数百万条记录,[json.loads(line)for line in inpt]
以什么方式不构成“将文件作为一个整体处理”?我现在很困惑。如果这个文件是有效的JSON,它将是一个列表,对吗?你想将它解释为什么类型?每行都是有效的JSON吗?例如:lines=[JSON.loads(line)for line in inpt]
完成工作吗?lines.append(JSON.loads(line))
?是的,但我不想处理每一行-我想作为一个整体处理文件-真正的一行有数百万条记录,[json.loads(line)for line in inpt]
以什么方式不构成“作为一个整体处理文件”“我现在很困惑。如果这个文件是有效的JSON,它将是一个列表,对吗?你想把它解释成什么类型?我想把文件作为一个整体来处理——因为真正的文件有数百万条记录?您可以像在代码中一样迭代输入文件的每一行,并在“for”循环中应用json.loads(line)。听起来很昂贵,我希望这样做既便宜又快速。如果您将所有解析的行存储在一个全局列表中,是的,这在RAM中会很昂贵。如果独立处理每一行,则当前行只使用一点内存。这就是“基于流的编程”。好吧,很酷-这只是数据[0]['record']
的问题-无论如何-谢谢你的这些伟大见解!我想把文件作为一个整体来处理——因为真正的文件有数百万条记录?您可以像在代码中一样迭代输入文件的每一行,并在“for”循环中应用json.loads(line)。听起来很昂贵,我希望这样做既便宜又快速。如果您将所有解析的行存储在一个全局列表中,是的,这在RAM中会很昂贵。如果独立处理每一行,则当前行只使用一点内存。这就是“基于流的编程”。好吧,很酷-这只是数据[0]['record']
的问题-无论如何-谢谢你的这些伟大见解!当我刚刚尝试它时,我得到了一个错误print(data['record'])TypeError:列表索引必须是整数,而不是str
,我如何验证它是否有效?因为这会解析文件并给你一个字典列表,而不是字典。但我想与它进行交互,就像与json进行交互一样,在普通的json中,我可以调用像data['record']
这样的东西,你知道我的意思吗?该死-我很抱歉这正是data[0]['record']
-谢谢你的大力帮助!~:)@s、 matthew.english它仍然是一个列表,所以items()
已退出<代码>记录=[item['record']表示数据中的项]应该这样做吗?我猜格式的要点是每一行都是有效的json,但文件作为一个整体不是。我也觉得这有点不舒服,但是你确实有一个字典列表,所以如果你知道如何迭代列表并按键抓取东西,那就没那么糟糕了。当我刚刚尝试时,我遇到了这个错误print(data['record'])TypeError:列表索引必须是整数,而不是str
,我如何验证它是否有效?因为它会解析文件并给你一个字典列表,而不是字典。但我想与它进行交互,就像我可以与json进行交互一样,在普通json中,我可以称之为data['record']
你知道我的意思吗?该死-我很抱歉这正是data[0]['record']
-感谢您的大力帮助!~:)@s、 matthew.english它仍然是一个列表,所以items()
已退出<代码>记录=[item['record']表示数据中的项]应该这样做吗?我猜格式的要点是每一行都是有效的json,但文件作为一个整体不是。我觉得这也有点不舒服,但你确实有一个字典列表,所以如果你知道如何遍历列表并按键抓取内容,那就没那么糟糕了。
with open('the file.json', 'rb') as infile:
data = infile.readlines()
data = [json.loads(item.replace('\n', '')) for item in data]