как восстановить плохую json в python - PullRequest
2 голосов
/ 03 февраля 2020

В данный момент мне приходится работать с базой данных с ошибкой json. Поэтому, когда я пытаюсь восстановить всю строку 1 на 1 в python, это невозможно, потому что в базе данных всегда есть проблема

picture of some line of database

Я понятия не имею, как ее восстановить. работать с этой базой данных.

Я пробовал это:

my_json = {

"name": "Khau0304lid Muhu0323ammad u02bbAliu0304 al-Hu0323au0304jj",
"personal_name": "Khau0304lid Muhu0323ammad u02bbAliu0304 al-Hu0323au0304jj",
"last_modified": {
    "type": "/type/datetime",
    "value": "2008-08-20T17:57:09.66187"
},
"key": "/authors/OL1000057A",
"type": {
    "key": "/type/author"
},
"revision": 2

}

name = my_json.get('name', "")
print(name)

Но когда у меня более одного имени, он не работает

Спасибо за внимание!

Ответы [ 6 ]

2 голосов
/ 03 февраля 2020

OK, Вот пример, чтобы нарезать много строк json.

my_json = '{"name": "Khau0304lid Muhu0323ammad u02bbAliu0304 al-Hu0323au0304jj",\
"personal_name": "Jacques", "last_modified": {"type": "/type/datetime", "value":\
"2008-08-20T17:57:09.66187"}, "key": "/authors/OL1000057A", "type": {"key":\
"/type/author"}, "revision": 2},{"name": "sdsdsdzzdzdfdfe", "personal_name":\
"Khau0304lid Muhu0323ammad u02bbAliu0304 al-Hu0323au0304jj", "last_modified": {"type":\
"/type/datetime", "value": "2008-08-20T17:57:09.66187"}, "key": "/authors/OL1000057A",\
"type": {"key": "/type/author"}, "revision": 2}'
JsonList = []
Stack = []
LastJsonEndIndex = 0
PassADot = False
for i in range(len(my_json)):
    if PassADot:
        PassADot = False
        continue
    if my_json[i] == "{":
        Stack.append(my_json[i])
    elif my_json[i] == "}":
        Stack.pop()
        if Stack == []:
            JsonList.append(my_json[LastJsonEndIndex:i+1])
            LastJsonEndIndex = i+2
            PassADot = True
    else:
        pass
print(JsonList)

Каждый элемент в JsonList является полной json строкой. Вы можете сохранить каждый элемент JsonList в json файл, и запустите то, что я публиковал в первую очередь.

Сохраните его:

my_json = '{"name": "Nazamiu0304 Rau0304majiu0304", "personal_name": "Nazamiu0304 Rau0304majiu0304", "last_modified": {"type": "/type/datetime", "value": "2008-08-20T18:00:41.270799"}, "key": "/authors/OL1001461A", "type": {"key": "/type/author"}, "revision": 2} {"name": "Harald A. Enge", "personal_name": "Harald A. Enge", "created": {"type": "/type/datetime", "value": "2008-04-01T03:28:50.625462"}, "alternate_names": ["Harald A Enge"], "last_modified": {"type": "/type/datetime", "value": "2013-02-25T09:47:06.574533"}, "latest_revision": 3, "key": "/authors/OL1001542A", "type": {"key": "/type/author"}, "revision": 3} {"name": "Umu Hilmy", "personal_name": "Umu Hilmy", "last_modified": {"type": "/type/datetime", "value": "2008-09-08T16:20:28.105165"}, "key": "/authors/OL100223A", "type": {"key": "/type/author"}, "revision": 2} {"name": "Ismail Ibrahim Dr.", "title": "Dr.", "personal_name": "Ismail Ibrahim", "last_modified": {"type": "/type/datetime", "value": "2008-04-01T03:28:50.625462"}, "key": "/authors/OL100304A", "type": {"key": "/type/author"}, "revision": 1} {"bio": {"type": "/type/text", "value": "> "Eversley, William Pinder, B.C.L. Queen\'s Coll., Oxon, M.A., a member of the South-eastern circuit, reporter for Law Times in Queen\'s Bench division, a student of the Inner Temple 14 April, 1874 (then aged 23), called to the bar 25 April, 1877 (eldest son of William Eversley, Esq., of London); born u2060, 1851. rn> rn> 7, King\'s Bench Walk, Temple, E.C." rn> ...[in Foster\'s Men at the Bar][1]rnrnrn rnrn[1]: https://en.wikisource.org/wiki/Men-at-the-Bar/Eversley,_William_Pinder "Men at the Bar""}, "name": "William Pinder Eversley", "created": {"type": "/type/datetime", "value": "2008-04-01T03:28:50.625462"}, "death_date": "1918", "photos": [6897255, 6897254], "last_modified": {"type": "/type/datetime", "value": "2018-07-31T15:39:07.982159"}, "latest_revision": 6, "key": "/authors/OL1003081A", "birth_date": "1851", "personal_name": "William Pinder Eversley", "type": {"key": "/type/author"}, "revision": 6} {"name": "Valerie Meyer", "personal_name": "Valerie Meyer", "last_modified": {"type": "/type/datetime", "value": "2008-08-20T18:22:33.63997"}, "key": "/authors/OL1004062A", "type": {"key": "/type/author"}, "revision": 2} {"name": "Ticonius", "created": {"type": "/type/datetime", "value": "2008-04-01T03:28:50.625462"}, "personal_name": "Ticonius", "birth_date": "4th cent.", "last_modified": {"type": "/type/datetime", "value": "2013-02-25T09:53:08.232734"}, "latest_revision": 2, "key": "/authors/OL1004101A", "date": "4th cent", "type": {"key": "/type/author"}, "revision": 2} {"name": "Abdul Kahar Muzakar", "created": {"type": "/type/datetime", "value": "2008-04-01T03:28:50.625462"}, "death_date": "1965", "last_modified": {"type": "/type/datetime", "value": "2017-03-31T12:48:41.973551"}, "latest_revision": 4, "key": "/authors/OL100450A", "birth_date": "1921", "personal_name": "Abdul Kahar Muzakar", "remote_ids": {"viaf": "11565164", "wikidata": "Q4665459"}, "type": {"key": "/type/author"}, "revision": 4} {"name": "Sheshadri Narayanan", "personal_name": "Sheshadri Narayanan", "last_modified": {"type": "/type/datetime", "value": "2008-08-20T18:36:13.030909"}, "key": "/authors/OL1005861A", "birth_date": "1936", "type": {"key": "/type/author"}, "revision": 2} {"name": "M. W. Nuttall", "personal_name": "M. W. Nuttall", "last_modified": {"type": "/type/datetime", "value": "2008-08-20T18:36:46.701507"}, "key": "/authors/OL1005942A", "birth_date": "1947", "type": {"key": "/type/author"}, "revision": 2} {"name": "R.-R Renella", "personal_name": "R.-R Renella", "last_modified": {"type": "/type/datetime", "value": "2008-08-20T18:40:50.827135"}, "key": "/authors/OL1006482A", "birth_date": "1949", "type": {"key": "/type/author"}, "revision": 2} {"name": "Caesar A. Casanova", "personal_name": "Caesar A. Casanova", "last_modified": {"type": "/type/datetime", "value": "2008-09-08T16:24:07.101641"}, "key": "/authors/OL100656A", "birth_date": "1948", "type": {"key": "/type/author"}, "revision": 2} {"name": "Rodney Fitch", "personal_name": "Rodney Fitch", "last_modified": {"type": "/type/datetime", "value": "2008-08-20T18:43:01.916355"}, "key": "/authors/OL1006767A", "type": {"key": "/type/author"}, "revision": 2} {"name": "Catherine Ingram", "links": [{"url": "http://catherineingram.com/biography.html", "type": {"key": "/type/link"}, "title": "Biography"}, {"url": "http://www.youtube.com/watch?v=4lJK9cfXP3c", "type": {"key": "/type/link"}, "title": "Interview on Consciousness TV"}, {"url": "http://www.huffingtonpost.com/catherine-ingram/", "type": {"key": "/type/link"}, "title": "Blog on Huffington Post"}], "created": {"type": "/type/datetime", "value": "2008-04-01T03:28:50.625462"}, "personal_name": "Catherine Ingram", "last_modified": {"type": "/type/datetime", "value": "2013-04-05T06:41:53.345668"}, "latest_revision": 4, "key": "/authors/OL1006815A", "birth_date": "1952", "type": {"key": "/type/author"}, "revision": 4}'
Stack = []
LastJsonEndIndex = 0
PassADot = False
Count = 0
for i in range(len(my_json)):
    if PassADot:
        PassADot = False
        continue
    if my_json[i] == "{":
        Stack.append(my_json[i])
    elif my_json[i] == "}":
        Stack.pop()
        if Stack == []:
            with open("./json{}.json".format(str(Count)),"w+") as f:
                f.write(my_json[LastJsonEndIndex:i+1])
            Count += 1
            LastJsonEndIndex = i+2
            PassADot = True
    else:
        pass

Он сгенерирует некоторый файл json. И вы можете связать это с моим первым постом.

1 голос
/ 04 февраля 2020

Думаю, вы меня не так поняли. В вашем openlibrary5.json есть много json в одном файле.

Так что, если вы напрямую загрузите этот файл как json. вот так

with open("openlibrary5.json","r") as f:
   yourJson = json.load(f)

получит ошибку.

Поэтому я предлагаю вам сначала нарезать их.

with open("openlibrary5.json","r") as f:
    stringJson = f.read()

И сделать то, что я написал, чтобы нарезать их (это строки, а не json) во многих (сохранить как) json файлах. После их нарезки один из нарезанных файлов json является полным json. Таким образом, вы можете использовать json.load() для их обычной загрузки.

Если вы действительно хотите собрать их вместе, после нарезки их можно открыть каждый нарезанный файл json и поместить их в List (используйте List.append)

Вы поняли?

1 голос
/ 03 февраля 2020

Вот пример, если используется строка,

my_json = '{"name": "Halo","action": "what?","name": "haha","action": "what?","name": "zzzz","action": "what?"}'
import json
def handle(lst):
    result = {}
    count = {}
    for key, val in lst:
        if key in count:
            count[key] = 1 + count[key]
        else:
            count[key] = 1
        if key in result:
            if count[key] > 2:
                result[key].append(val)
            else:
                result[key] = [result[key], val]
        else:
            result[key] = val
    return result
my_json = json.loads(my_json,object_pairs_hook=handle)
print(my_json['name'])

Результат будет ['Halo', 'haha', 'zzzz']

А если у вас есть файл json, то

import json
def handle(lst):
    result = {}
    count = {}
    for key, val in lst:
        if key in count:
            count[key] = 1 + count[key]
        else:
            count[key] = 1
        if key in result:
            if count[key] > 2:
                result[key].append(val)
            else:
                result[key] = [result[key], val]
        else:
            result[key] = val
    return result
with open("./a.json","r") as f:
    my_json = json.load(f,object_pairs_hook=handle)
print(my_json['name'])

Подробнее о object_pairs_hook

0 голосов
/ 07 февраля 2020

Так что с прошлого раза я многое сделал, у меня вся моя строка в json всех моих данных, кроме строк: «био», я показываю вам:

 import json,sqlite3

 ligne = []
 personal_nom = []
 tout = []

 conn = sqlite3.connect('database.db')
 cur = conn.cursor()
 cur.execute("""
 CREATE TABLE IF NOT EXISTS OPENLIBRARY3(
 id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
 nom TEXT,
 personal_name TEXT
 )
 """)
 conn.commit()

 with open('openlibrary.json') as file:
 for i in range(98):
    line = file.readline()
    if "bio" in line:
        line.replace("\'", "’")
        continue
    content_json = json.loads(line)
    if not "name" in line:
       #print('NULL')
       ligne.append("NULL")
       continue
    try:
        #print(content_json['name'])
        ligne.append(content_json['name'])
    except IndexError:
        print
    if not "personal_name" in line:
        # print('NULL')
        personal_nom.append("NULL")
        continue
    try:
        # print(content_json['name'])
        personal_nom.append(content_json['personal_name'])
    except IndexError:
        print


  #print(ligne)
  #print(personal_nom)


  #for i in ligne:



  new_list=[]
  #for y in range(0,len(ligne)):
  #    list.append(("("+ligne[(y)]+")"))

  #for element in ligne:
  #    new_list.append(tuple(element))

 #print(new_list)

 resultat = []
 for name in zip(ligne):
   resultat.append((name))
 #print(resultat)


 print(tout)


 cur.executemany("""
 INSERT INTO OPENLIBRARY3(nom) VALUES(?)""", resultat)
 #cur.executemany("""
 #INSERT INTO OPENLIBRARY3(personal_name) VALUES(?)""", personal_nom)

 valeur = []

req = "select * from OPENLIBRARY3"
result = cur.execute(req)
print(type(result))
for row in result:
   valeur.append(row[1])

print(valeur)
#for j in range(len(ligne)):
#    content = ligne[j]
#    content_json = json.loads(content)
#    print(content_json['name'])

я получил это

[('violette', '2018-05-23'), ('violete', '2018-05-23'), ('Alice au pays des merveilles', '2017- 12-23 '), (' Alice aux pays des merveilles ',' 2017-12-23 '), (' La plaete des singes ',' 2015-02-1 '), (' La planete des singes 2 ', '2016-03-16'), ('Titani c', '2012-02-02'), ('Kin g Kong', '2004-04-12'), ('Kink Konk', '2005 -09-25 ')]

проблема в том, что я не могу восстановить эту строку, потому что у нее всегда много проблем:

{"bio": {"type": " / type / text "," value ":"> "Eversley, William Pinder, B. C .L. Queen's Coll., Оксон, Массачусетс, член юго-восточного округа, репортер Law Law в отделении Queen's Bench, ученик Внутреннего Храма 14 апреля 1874 года (тогда ему было 23 года), вызванный в бар 25 апреля 1877 года (старший сын Уильяма Эверсли, эсквайр, из Лондона); р. u2060, 1851. rn> rn> 7, King's Bench Walk, Temple, E. C. "rn> ... [in Foster's Men at the Bar ] [1] rnrnrn rnrn [1 ]: https://en.wikisource.org/wiki/Men-at-the-Bar/Eversley, _ William_Pinder"Люди за барной стойкой" "}," name ":" William Pinder Eversley "," созданный ": {" type ":" / type / datetime "," value ":" 2008-04-01T03: 28: 50.625462 "}," death_date ":" 1918 "," photos ": [6897255, 6897254]," last_modified ": {" type ":" / type / datetime "," значение ":" 2018-07-31T15: 39: 07.982159 "}," latest_revision ": 6," ключ ":" / авторы / OL1003081A "," дата рождения ":" 1851 "," личное имя ":" Уильям Пиндер Эверсли " , "type": {"key": "/ type / author"}, "revision": 6}

Когда я вставляю эту строку в python для восстановления с моим кодом, она выдает ошибку так что мне нужно не брать это и все работы, я пытался что-то в пакетном режиме, я пытался заменить каждый "в био за", но это ставит другую проблему и другую проблему, я понятия не имею, как я могу это исправить, я не знаю, возможно ли это ...

Спасибо, что выслушал меня и извините, я пришел сюда поздно, потому что я я очень старался.

Еще раз спасибо!

Если я плохо говорил о своей проблеме, задайте вопрос, и я уточню!

0 голосов
/ 03 февраля 2020

Когда я использую ваш код для разбора json, он работает отлично.

Но я просто спрашиваю меня, как я могу добавить \ как вы, но для 10000000 строк данных.

Когда я беру ваш my_json_file, он работает, и он разбивается на 13 файлов, но когда Я взял свои реальные данные, это не работает.

Вот почему я ищу, как сделать что-то похожее на тебя, но я не могу добавить для себя

0 голосов
/ 03 февраля 2020

Я публикую новый ответ, потому что я ничего не понял о вашем коде

Когда вы сказали:

Stack = []
LastJsonEndIndex = 0
PassADot = False
Count = 0
for i in range(len(my_json)):
if PassADot:
    PassADot = False
    continue
if my_json[i] == "{":
    Stack.append(my_json[i])
elif my_json[i] == "}":
    Stack.pop()
    if Stack == []:
        with open("./json{}.json".format(str(Count)),"w+") as f:
            f.write(my_json[LastJsonEndIndex:i+1])
        Count += 1
        LastJsonEndIndex = i+2
        PassADot = True
else:
    pass

Здесь вы использовали в своем коде my_json_file = ..... ... и однажды у вас есть это:

{"bio": {"type": "/ type / text", "value": ">" Eversley, William Pinder, B. C .L. Queen's Coll., Оксон, Массачусетс, член юго-восточного округа, репортер Law Law в отделении Queen's Bench, ученик Внутреннего Храма 14 апреля 1874 года (тогда ему было 23 года), вызванный в бар 25 апреля 1877 года (старший сын Уильяма Эверсли, эсквайр, из Лондона); р. u2060, 1851. rn> rn> 7, King's Bench Walk, Temple, E. C. "rn> ... [in Foster's Men at the Bar ] [1] rnrnrn rnrn [1 ]: https://en.wikisource.org/wiki/Men-at-the-Bar/Eversley, _ William_Pinder"Мужчины за барной стойкой" "}," name ":" William Pinder Eversley "," созданный ": {" type ":" / type / datetime "," value ":" 2008-04-01T03: 28: 50.625462 "}," death_date ":" 1918 "," photos ": [6897255, 6897254]," last_modified ": {" type ":" / type / datetime "," значение ":" 2018-07-31T15: 39: 07.982159 "}," latest_revision ": 6," ключ ":" / авторы / OL1003081A "," дата рождения ":" 1851 "," личное имя ":" Уильям Пиндер Эверсли " , "type": {"key": "/ type / author"}, "revision": 6}

Но как вы сделали, чтобы удалить эту ошибку и добавить \ в правильное положение, чтобы не было ошибки .

Можете ли вы объяснить мне, пожалуйста? Вы сделали это со своим сценарием? или ручной?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...