Python 读取一行中存储的词典文本文件 问题

Python 读取一行中存储的词典文本文件 问题,python,Python,我有一个文本文件,记录研究论文的元数据。但是,当我编写请求的数据时,我忘记为每个记录添加\n。这会导致如下结果: {<metadata1>}{<metadata2>}{<metadata3>}... 现在,我想读一下数据。由于所有元数据现在都存储在一行中,我需要做一些修改 首先,我使用{。 然后我尝试将字符串行转换回DITENTENT,我认为行可能不是正确的JSON格式。 导入json 使用openmetadata.json,r作为f: 对于f.readli

我有一个文本文件,记录研究论文的元数据。但是,当我编写请求的数据时,我忘记为每个记录添加\n。这会导致如下结果:

{<metadata1>}{<metadata2>}{<metadata3>}...
现在,我想读一下数据。由于所有元数据现在都存储在一行中,我需要做一些修改

首先,我使用{。 然后我尝试将字符串行转换回DITENTENT,我认为行可能不是正确的JSON格式。 导入json 使用openmetadata.json,r作为f: 对于f.readline.split{中的行: printjson.load{+line.replace\'\ 但是,仍然有一条错误消息

JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
我想知道我应该做什么来恢复我收集的所有元数据

MWE 注意,为了获得我使用的metadata.json文件,请使用以下代码,它应该是现成的

导入json 导入URL库 导入请求 baseURL=https://api.semanticscholar.org/v1/paper/ paperIDList=[200794f9b353c1fe3b45c6b57e8ad954944b1e69, b407a81019650fe8b0acf7e4f8f18451f9c803d5, ff118a6a74d1e522f147a9aaf0df5877fd66e377] 对于paperIDList中的paperID: response=requests.geturllib.parse.urljoinbaseURL,paperID 元数据=response.json 录音 记录[标题]=元数据[标题] 记录[摘要]=元数据[摘要] 记录[paperId]=元数据[paperId] 记录[年]=元数据[年] 记录[引文]=[元数据中的项目[引文]的项目[paperId],如果项目[paperId]] 记录[references]=[item[paperId]用于元数据中的项目[references],如果项目[paperId]] 使用openmetadata.json,作为文件对象: fileObject.writejson.dumpsrecord
问题是,当您分割{时,您得到的第一个项是空的,对应于开头{。忽略第一个元素,一切正常。我在引号替换中添加了一个r,以便python将其视为并正确替换:

with open("metadata.json", "r") as f:
     for line in f.readline().split("{")[1:]:
         print(json.loads("{" + line).replace(r"\'", r"\""))
正如评论中所建议的,我实际上建议重新创建该文件或保存一个新版本,将}{by}\n{:


这样,您就可以根据需要获得每行一张纸的元数据。

如果不查看元数据,我们将无法帮助您…我建议您使用pickle.dump和pickle.load而不是JSON来操作文件为什么不在每条记录的末尾使用\n重新创建metadata.JSON文件?@adirabargil我已经提供了脚本来获取我的信息MWE部分中的tadata.json。@LeonardoScotti是的。这是一个适用于较小文件的很好的解决方案。但在我的例子中,有将近50万条记录,直接使用pickle.dump是有问题的。谢谢!我认为重新创建整个文件是一个很好的解决方案。不客气。我只是对答案进行了修改。您不需要删除该文件替换,只需使用正确的语法。
with open("metadata.json", "r") as f:
     for line in f.readline().split("{")[1:]:
         print(json.loads("{" + line).replace(r"\'", r"\""))
with open("metadata.json", "r") as f:
    data = f.read()
data_lines = data.replace("}{","}\n{")
with open("metadata_mod.json", "w") as f:
    f.write(data_lines)