Рейтинг:
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