Pertanyaan

Saya memiliki file teks yang merekam metadata makalah penelitian yang diminta dengan API SemanticScholar. Namun, ketika saya menulis data yang diminta, saya lupa menambahkan "\n" untuk setiap catatan individu. Ini menghasilkan sesuatu yang terlihat seperti

{<metadata1>}{<metadata2>}{<metadata3>}...

Dan ini seharusnya jika saya menambahkan "\n".

{<metadata1>}
{<metadata2>}
{<metadata3>}
...

Sekarang, saya ingin membaca datanya. Karena semua metadata sekarang disimpan dalam satu baris, saya perlu melakukan beberapa peretasan

  • Pertama saya membagi dicts yang berantakan menggunakan "{".
  • Kemudian saya mencoba mengonversi string line kembali ke dict. Perhatikan bahwa saya menganggap line mungkin tidak dalam format JSON yang tepat.
import json
with open("metadata.json", "r") as f:
    for line in f.readline().split("{"):
        print(json.loads("{" + line.replace("\'", "\"")))

Namun, masih ada pesan kesalahan

JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

Saya bertanya-tanya apa yang harus saya lakukan untuk memulihkan semua metadata yang saya kumpulkan?

MW

Catatan, untuk mendapatkan file metadata.json yang saya gunakan, gunakan kode berikut, itu harus bekerja di luar kotak.

import json
import urllib
import requests

baseURL = "https://api.semanticscholar.org/v1/paper/"
paperIDList = ["200794f9b353c1fe3b45c6b57e8ad954944b1e69",
               "b407a81019650fe8b0acf7e4f8f18451f9c803d5",
               "ff118a6a74d1e522f147a9aaf0df5877fd66e377"]

for paperID in paperIDList:
    response = requests.get(urllib.parse.urljoin(baseURL, paperID))
    metadata = response.json()
    record = dict()
    record["title"] = metadata["title"]
    record["abstract"] = metadata["abstract"]
    record["paperId"] = metadata["paperId"]
    record["year"] = metadata["year"]
    record["citations"] = [item["paperId"] for item in metadata["citations"] if item["paperId"]]
    record["references"] = [item["paperId"] for item in metadata["references"] if item["paperId"]]
    with open("metadata.json", "a") as fileObject:
        fileObject.write(json.dumps(record))
1
Mr.Robot 19 November 2020, 19:36

1 menjawab

Jawaban Terbaik

Masalahnya adalah ketika Anda melakukan split("{") Anda mendapatkan item pertama yang kosong, sesuai dengan pembukaan {. Abaikan saja elemen pertama dan semuanya berfungsi dengan baik (saya menambahkan r dalam penggantian kutipan Anda sehingga python menganggapnya sebagai literal string dan ganti dengan benar):

with open("metadata.json", "r") as f:
     for line in f.readline().split("{")[1:]:
         print(json.loads("{" + line).replace(r"\'", r"\""))

Seperti yang disarankan dalam komentar, saya sebenarnya akan merekomendasikan membuat ulang file atau menyimpan versi baru tempat Anda mengganti }{ dengan }\n{:

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)

Dengan begitu Anda akan memiliki metadata kertas per baris seperti yang Anda inginkan.

1
wagnifico 19 November 2020, 17:38