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