Jack Raif Ответов: 3

Форматирование JSON - помогите!


Привет,
У меня есть несколько файлов, которые мне нужно отформатировать, чтобы они были одним файлом JSON:

Вот пример файла, который у меня есть:
{"t": "test", "title": "test", "content": "test"}
{"t": "test2", "title": "test", "content": "test2"}


Что мне нужно, так это быть похожим на него.:
[
{"t": "test", "title": "test", "content": "test"},
{"t": "test2", "title": "test2", "content": "test2"}
]


В конце концов это будет выглядеть так (Обратите внимание, что приведенный ниже JSON похож на приведенный выше, второй, один):
[{
		"t": "test",
		"title": "test",
		"content": "test"
	},
	{
		"t": "test2",
		"title": "testw",
		"content": "test2"
	}
]


Что я уже пробовал:

У меня есть приведенный ниже код python:

import io
import os
import json

def wrap_files_in_dir(dirname):


    data = {}

    list_of_reviews = []


    for filename in os.listdir(dirname):
        file_path = os.path.join(dirname, filename)
        if os.path.isfile(file_path):
            with io.open(file_path, 'r', encoding='utf-8', errors='ignore') as rfile:
                contents = rfile.read()
                list_of_reviews.append(contents)




    with io.open('AppStoreReviews.json', 'w', encoding='utf-8' , errors='ignore') as wfile:
        data["reviews"] = list_of_reviews
        wfile.write(unicode(json.dumps(data, ensure_ascii=False)))


if __name__ == '__main__':
    wrap_files_in_dir('/Users/Jack/PycharmProjects/MyProject')

print("Your Reviews marged and converted to JSON")



Я знаю, что мне не хватает какого-то кода, который вводится в каждый файл в моем каталоге ... или это может быть что-то другое?
Может ли кто - нибудь помочь мне с этим?

проблема в том, что код действительно создает мне файл JSON, но JSON не имеет никаких массивов и не имеет никаких "," между моими объектами.

CHill60

В чем же проблема?

Jack Raif

Я не знаю, чего мне не хватает в моем коде.

Jack Raif

Позвольте мне быть более конкретным, проблема заключается в том, что код действительно создает мне файл JSON, но JSON не имеет никаких массивов и не имеет никаких "," между моими объектами.

Patrice T

Показать фактический результат

Richard MacCutchan

Смотрите мое обновленное решение.

3 Ответов

Рейтинг:
2

Richard MacCutchan

Следующий код производит (я надеюсь) то, что вы ищете:

import io
import os
import json

def wrap_files_in_dir(dirname):
    data = {}
    list_of_reviews = []

    for filename in os.listdir(dirname):
        file_path = os.path.join(dirname, filename)
        if os.path.isfile(file_path):
            with io.open(file_path, 'r', encoding='utf-8', errors='ignore') as rfile:
                review = json.load(rfile)
                list_of_reviews.append(review)

    with io.open('AppStoreReviews.json', 'w', encoding='utf-8' , errors='ignore') as wfile:
        json.dump(list_of_reviews, wfile, indent=2)

if __name__ == '__main__':
    wrap_files_in_dir('C:\\Users\\rjmac\\Documents\\_Python\\JFiles')

print("Your Reviews marged and converted to JSON")


Jack Raif

Отлично! но мне все еще не хватает "," между моими объектами..

Richard MacCutchan

Ладно, я сдаюсь. Где же он?

Jack Raif

Я думаю, что знаю, чего мне не хватает, но мне нужна помощь в его реализации:

list_of_reviews = [] готово

для файла в каталоге: - готово

для строки в файле: - отсутствует

review = line.parsfromjson () - отсутствует
list_of_reviews.append(обзор) - отсутствует

Richard MacCutchan

Чтение файла строка за строкой легко, см. раздел 7.2.1 по адресу 7. ввод и вывод — документация Python 3.7.1[^].

Последние две строки, которые, как вы говорите, отсутствуют, должны быть легко добавлены в цикл чтения. Хотя я не уверен, что вы пытаетесь разобрать из JSON, все зависит от данных, которые вы обрабатываете.

Richard MacCutchan

Смотрите мое обновленное решение.

Jack Raif

Спасибо, Ричард, но мои файлы все равно начинаются именно так: ["{
Я предоставил вам доступ, чтобы вы могли увидеть содержимое файлов перед запуском скрипта:

https://drive.google.com/drive/folders/1YUnesBEI8ZzDOVHmKt6MU3wuAWfUnBVf?usp=sharing

Richard MacCutchan

Не те файлы, которые вы загрузили. Например, файл reviews-20181023.log содержит следующее:

{"t": "23/Oct/2018:09:40:39 -07:00", "title": "A great resource undercut by terrible management", "content": "I found Houzz as a resource for inspiration pictures in building a new house, but I quickly discovered that it held even more value in the forums, especially those that originated in GardenWeb, which were filled with long-time members and experienced professionals who gave their advice for free. Unfortunately, Houzz\u2019s terrible management decisions have driven away many of those people. They\u2019re destroying much of what made the site and app unique and valuable to me as a homebuilder.", "title_en": "A great resource undercut by terrible management", "content_en": "I found Houzz as a resource for inspiration pictures in building a new house, but I quickly discovered that it held even more value in the forums, especially those that originated in GardenWeb, which were filled with long-time members and experienced professionals who gave their advice for free. Unfortunately, Houzz\u2019s terrible management decisions have driven away many of those people. They\u2019re destroying much of what made the site and app unique and valuable to me as a homebuilder.", "id": "3335244003", "voteSum": "0", "voteCount": "0", "rating": "2", "version": "18.10.0", "author": "KrisABS123", "country": "US", "store": "iTunes", "app_name": "houzz"}

Jack Raif

Да, и все же скрипт добавляет массив вот так: [" к началу и концу "] вместо этого просто добавляет массивы и остаются объекты внутри: [{}]

Richard MacCutchan

Извините, но я не понимаю, о чем вы говорите. Когда я проверил входные данные и то, что генерируется в выходном файле, он правильно создает один массив с другими строками внутри, в виде:

[{"first line ..."}, {"next line ..."}, {"and so on ..."}]

Что именно вы получаете?

Jack Raif

Странно, но мой вывод выглядит так:

["{"первая строка..."}", " {"следующая строка..."}", "{"и так далее..."}"]

Richard MacCutchan

Что ж, это верно. Когда вы используете json.загрузите его, чтобы прочитать обратно, он будет десериализован правильно.

Jack Raif

У вас есть какое-нибудь решение?

Richard MacCutchan

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

Jack Raif

После того, как я маржу файлы в один JSON-файл, я загружаю этот JSON в DropBox, а затем использую Google Sheet (=ImportJSON()) для просмотра отзывов.


Проблема в том, что скрипт, о котором мы говорим, создает целые объекты в виде строки внутри массива:

["{"первая строка..."}", " {"следующая строка..."}", "{"и так далее..."}"]

Richard MacCutchan

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

Jack Raif

Является ли мой код правильным?

деф wrap_files_in_dir(каталог):




list_of_reviews = []


для имени файла в os.listdir(dirname):
путь_к_файлу = ОС.путь.присоединиться(каталог, имя файла) ###!
если os.path.isfile(file_path):
с IO.открыть(путь_к_файлу, 'Р', кодировка='кодировка UTF-8', ошибок='игнорировать') как rfile:
для линии в rfile:
list_of_reviews.append(line.rstrip())



с IO.AppStoreReviews открыть ('.формат JSON', 'ж', кодировка='кодировка UTF-8', ошибок='игнорировать') как wfile:
wfile.писать(Юникод(в формате JSON.дампы(list_of_reviews, ensure_ascii=ложь)))


если __name__ == '__main__':
wrap_files_in_dir('/Users/Projects/PycharmProjects/json')

Jack Raif

Может ли он быть сгенерирован таким образом?

[{
"Т": "17 октября/2018:05:55:58 -07:00",
"название": "Publicit\u00e9 mensong\u00e8re",
"содержание": "voulais тестер Йе л\u2019app залить СА с обивкой из Де R\u00e9alit\u00e9 увеличить\u00e9e permettant-де-визуализатор лес meublesбыл данс Нотр-инт\u00e9rieur. Этого обивкой есть компл\u00e8tement дифф\u00e9rente-де-ла-версию монтр\u00e9e данс Ла видъ\u00e9o Эт компл\u00e8tement никчемная ! On ne peut pas tourner autour des objets, les meubles sont mal d\u00e9tour \ u00e9s... \ntr\u00e8s d\u00e9\u00e7ue",
"title_en": "ложная реклама",
"content_en": "я хотел протестировать приложение для его функции дополненной реальности, чтобы визуализировать мебель в нашем интерьере. Эта функция полностью отличается от версии, показанной на видео, и совершенно бесполезна ! Вы не можете повернуть вокруг предметов, мебель плохо d\u00e9tour\u00e9s... \nvery разочарованы",
"id": "3312163433",
"voteSum": "0",
"voteCount": "0",
"рейтинг": "1",
"версия": "18.10.0",
"автор": "Шарлотта В.",
"страна": "фр",
"магазин": "iTunes",
"функция app_name": "тест"
},
{
"Т": "17 октября/2018:05:55:58 -07:00",
"название": "Publicit\u00e9 mensong\u00e8re",
"содержание": "voulais тестер Йе л\u2019app залить СА с обивкой из Де R\u00e9alit\u00e9 увеличить\u00e9e permettant-де-визуализатор лес meublesбыл данс Нотр-инт\u00e9rieur. Этого обивкой есть компл\u00e8tement дифф\u00e9rente-де-ла-версию монтр\u00e9e данс Ла видъ\u00e9o Эт компл\u00e8tement никчемная ! On ne peut pas tourner autour des objets, les meubles sont mal d\u00e9tour \ u00e9s... \ntr\u00e8s d\u00e9\u00e7ue",
"title_en": "ложная реклама",
"content_en": "я хотел протестировать приложение для его функции дополненной реальности, чтобы визуализировать мебель в нашем интерьере. Эта функция полностью отличается от версии, показанной на видео, и совершенно бесполезна ! Вы не можете повернуть вокруг предметов, мебель плохо d\u00e9tour\u00e9s... \nvery разочарованы",
"id": "3312163433",
"voteSum": "0",
"voteCount": "0",
"рейтинг": "1",
"версия": "18.10.0",
"автор": "Шарлотта В.",
"страна": "фр",
"магазин": "iTunes",
"функция app_name": "тест"
}
]

Рейтинг:
2

MadMyche

Самое простое решение этой проблемы-поставить запятую в каждой строке, кроме первой.
Способ сделать это состоял бы в том, чтобы установить переменную, чтобы знать, является ли текущая строка первой, а затем реализовать if...then блок

К сожалению, я знаю питона так же хорошо, как и клингона... таким образом, вам, вероятно, придется массировать изменения в коде, которые я сделал

# create boolean variable for "IsFirst"
IsFirst = true

for filename in os.listdir(dirname):
   file_path = os.path.join(dirname, filename)
      if os.path.isfile(file_path):
         with io.open(file_path, 'r', encoding='utf-8', errors='ignore') as rfile:

            # If IsFirst, add contents as is, and set IsFirst to false
            if (IsFirst == true) 
               contents = rfile.read()
               IsFirst = false
            # if NOT IsFirst, prepend a comma to the contents

            else 
               contents = "," + rfile.read()

            list_of_reviews.append(contents)


Richard MacCutchan

Система JSON расставит запятые в нужных местах.

MadMyche

Ну, по какой-то причине это не происходит в соответствии с ОП

Richard MacCutchan

Отлично работает в моем тесте. И как это часто бывает, мы не получаем полной информации.

Richard MacCutchan

И если вы посмотрите на результаты, показанные в исходных вопросах, все запятые находятся там в правильных местах.

MadMyche

Ты имеешь в виду вот это?

Вот пример файла, который у меня есть:
{"Т": "тест", "название": "Тест", "содержание": "тест"}
{"t": "test2", "название": "test", "содержание": "test2"}

Richard MacCutchan

Ну, я не могу быть уверен, так как вопрос не ясен. Я предполагаю, что это текст из входного файла(ов). Он читает каждую строку файлов и создает список, многократно вызывая их list_of_reviews.append(contents).

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

MadMyche

Я тоже не знаю, и незнание python не помогает. Возможно, это разбор файла-это строка, возможно, OP нуждается в строке "date = json.load(file)"

Richard MacCutchan

Нет, я думаю, что создание списка работает нормально, как я проверил с помощью своей тестовой программы. А также сгенерированный JSON вышел правильно. Нам нужны еще некоторые, и более конкретные, детали из операции.

Jack Raif

Хорошо, я добавляю каталог файлов, которые у меня есть, может быть, вы определите, где проблема?

https://drive.google.com/drive/folders/1YUnesBEI8ZzDOVHmKt6MU3wuAWfUnBVf?usp=sharing

Jack Raif

Это те файлы, которые я хочу передать в один JSON

Рейтинг:
12

Jack Raif

найти решение:

list_of_reviews = []

   for filename in os.listdir(dirname):
       if not filename.startswith('.'):
           file_path = os.path.join(dirname, filename)
           if os.path.isfile(file_path):
        with io.open(file_path, 'r', encoding='utf-8', errors='ignore') as rfile:
                   lines = rfile.readlines()
                   for line in lines:
                       line = line.rstrip()
                       review = json.loads(line)
                       list_of_reviews.append(review)


Спасибо всем, кто помогал!


Richard MacCutchan

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