Найти - Пользователи
Полная версия: чтение json фаилов
Начало » Python для новичков » чтение json фаилов
1 2
Areostar
имеется каталог в который вложнно несколько других. в каждом из клоторых находитсяпо одному или больше json файлов.

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

Пытаюсь так:
 import json
import os
pathToJson = "./data"
jsonData = []
tempList = ""
for top, dirs, files in os.walk(pathToJson):
    for nm in files:
        with open(os.path.join(top, nm)) as f:
            tempList += f.read().replace('\n', '')
print(tempList)


получаю что то такое
“], ”]][ {“id”:“4”, “creation_date”:“11.06.2019 04:25:56”, “fname”:“Itan”, “lname”:“Gello”, “code”:“ws00264055674201”, “value”:“250” }, {“id”:“5”, “creation_date”:“11.06.2019 06:52:36”, “fname”:“Fridrih”, “lname”:“Ott”, “code”:“wa0766203332278”, “value”:“540” }, {“id”:“6”. “creation_date”:“11.06.2019 07:22:54”, “fname”:“Daniel”, “lname”:“Ferro”, “code”:“we0644335462404”, “value”:“670” }

как надо решать эту задачу?
JOHN_16
Основная сложность в определении что именно значит это
Areostar
адо получить содержимое всех фаилов сформировать из них единый json обьект
Вот какой нужен метод получения этого единого json объекта. Например в первом файлы содержимое вида
 {"a": [1]}
Второго файла
 {"a": [2]}
Что должно в итоге получится?
И тд и тп. Или может вы хотите получить в результате json документ где на первом уровне это список, элементы которого это содержимое файлов?

Areostar
все исходные файлы обладают одинаковой структурой
Задача слить их в один обьект и скажим запсать в общий фаил.

придётся распарсивать ручками? Быстрее неполучиться?
doza_and
Areostar
Быстрее неполучиться?
Конечно получится. Вы на свой код посмотрите. Вы import json выполнили. А где вы его используете? Более того, ручками не надо делать, вы легко можете получить файл неправильного формата.

Areostar
файлы обладают одинаковой структурой
Задача слить их в один объект
Как вам правильно написали, при такой постановке задачи вы ее никогда не решите потому что нет однозначного представления что вы хотите сделать. Дополнительные обстоятельства вы вытаскиваете как фокусник из кармана. Кто на форуме знал что у них одинаковая структура? А какой смысл вы вкладываете в понятие одинаковая структура?

Приведите пример. Содержимое 3 файлов, места их расположения в папках и результирующий файл. А еще лучше, словами опишите правила слияния.

Areostar
как надо решать эту задачу?
Собственно это не к нам вопрос а к вам. Нам ваш результат нравится. Если он вам не нравится, напишите почему.

Есть некоторые соображения конечно.

Пример данных напоминает выгрузку из таблицы в самом дурацком из возможных видов.
В простейшем случае грузите данные модулем json, объединяете то что загрузили += выгружаете в файл модулем json

 >>> a=[]
>>> a+=[1,2,3]
>>> a
[1, 2, 3]
>>> a+=[1,2,3]
>>> a
[1, 2, 3, 1, 2, 3]

Но! Если это таблица, то вы получите таким образом некорректное поле id. Если это таблица то и надо преобразовать все данные в таблицу и хранить их надо в csv или базе данных
py.user.next
Areostar
надо получить содержимое всех фаилов сформировать из них единый json обьект.
Напиши функцию для слияния двух файлов. Потом применяй её для первого файла и второго файла. Так ты получишь слитый файл. А затем применяй эту функцию для этого слитого файла и третьего файла. Так ты получишь слитый файл. А затем применяй эту функцию для этого слитого файла и четвёртого файла. И так делаешь, пока файлы не закончатся. В конце у тебя получится один слитый файл, в котором вся информация из всех файлов.
Areostar
И так начнём с начала:

на данный момент у меня 4 папки 21.05.2019, 23.05.2019, 27.05.2019, и 09.06.2019

и только в дыух первых лежит по одному файлику с содержимым в формате json

Делаю так:
 pathToJson = "./data"
folderList = []
jsonData = []
for foldername in os.listdir(pathToJson):
    folderList.append(pathToJson+"/"+foldername)
    for subFolderName in folderList:
        if len(os.listdir(subFolderName)) > 0:
            print(subFolderName)
            for file in os.listdir(subFolderName):
                handle = open(subFolderName+"/"+file, "r")
                data = handle.read()
                print(data)
                handle.close()

в консоле получаю:

./data/21.05.2019
[
{“id”:“1”, “creation_date”:“10.06.2019 05:45:56”, “fname”:“Alen”, “lname”:“Delon”, “code”:“wa0023402333201”, “value”:“150” },
{“id”:“2”, “creation_date”:“10.06.2019 06:02:36”, “fname”:“George”, “lname”:“Otts”, “code”:“wa0024203457288”, “value”:“240” },
{“id”:“3”, “creation_date”:“10.06.2019 06:12:24”, “fname”:“Daniel”, “lname”:“Erro”, “code”:“we0005335222404”, “value”:“470” }
]
./data/21.05.2019
[
{“id”:“1”, “creation_date”:“10.06.2019 05:45:56”, “fname”:“Alen”, “lname”:“Delon”, “code”:“wa0023402333201”, “value”:“150” },
{“id”:“2”, “creation_date”:“10.06.2019 06:02:36”, “fname”:“George”, “lname”:“Otts”, “code”:“wa0024203457288”, “value”:“240” },
{“id”:“3”, “creation_date”:“10.06.2019 06:12:24”, “fname”:“Daniel”, “lname”:“Erro”, “code”:“we0005335222404”, “value”:“470” }
]
./data/23.05.2019
[
{“id”:“4”, “creation_date”:“11.06.2019 04:25:56”, “fname”:“Itan”, “lname”:“Gello”, “code”:“ws00264055674201”, “value”:“250” },
{“id”:“5”, “creation_date”:“11.06.2019 06:52:36”, “fname”:“Fridrih”, “lname”:“Ott”, “code”:“wa0766203332278”, “value”:“540” },
{“id”:“6”, “creation_date”:“11.06.2019 07:22:54”, “fname”:“Daniel”, “lname”:“Ferro”, “code”:“we0644335462404”, “value”:“670” }
]
./data/21.05.2019
[
{“id”:“1”, “creation_date”:“10.06.2019 05:45:56”, “fname”:“Alen”, “lname”:“Delon”, “code”:“wa0023402333201”, “value”:“150” },
{“id”:“2”, “creation_date”:“10.06.2019 06:02:36”, “fname”:“George”, “lname”:“Otts”, “code”:“wa0024203457288”, “value”:“240” },
{“id”:“3”, “creation_date”:“10.06.2019 06:12:24”, “fname”:“Daniel”, “lname”:“Erro”, “code”:“we0005335222404”, “value”:“470” }
]
./data/23.05.2019
[
{“id”:“4”, “creation_date”:“11.06.2019 04:25:56”, “fname”:“Itan”, “lname”:“Gello”, “code”:“ws00264055674201”, “value”:“250” },
{“id”:“5”, “creation_date”:“11.06.2019 06:52:36”, “fname”:“Fridrih”, “lname”:“Ott”, “code”:“wa0766203332278”, “value”:“540” },
{“id”:“6”, “creation_date”:“11.06.2019 07:22:54”, “fname”:“Daniel”, “lname”:“Ferro”, “code”:“we0644335462404”, “value”:“670” }
]

почему каждый фаил по двараза всплывает? Я гдето ошибся?

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

Надо конвертнуть в массивы откинуть id, обьединить массивы и конвертнуть обратно
Areostar
Так поблемму с двойным выводом решил.
Все время забываю про отступы.

Слудующий вопрос

Можно ли как нибудь улучшить этот код?(как)

А то както топорно получается! ))
Areostar
вот пока решил так

 pathToJson = "./data"
folderList = []
jsonData = []
for foldername in os.listdir(pathToJson):
    folderList.append(pathToJson+"/"+foldername)
for subFolderName in folderList:
    if len(os.listdir(subFolderName)) > 0:
        for file in os.listdir(subFolderName):
            handle = open(subFolderName+"/"+file, "r")
            data = json.loads(handle.read())
            for record in data:
                jsonData.append({"creation_date":record["creation_date"], "fname":record["fname"], "lname":record["lname"], "code":record["code"], "value":record["value"]})
            handle.close()
print(jsonData)
newJson = json.dumps(jsonData)
print(newJson)
doza_and
Areostar
Можно ли как нибудь улучшить этот код?(как)
В некоторых аспектах ваш код выглядит как пособие о том как не надо делать.

Вместо
 folderList = []
jsonData = []
for foldername in os.listdir(pathToJson):
    folderList.append(pathToJson+"/"+foldername)
    for subFolderName in folderList:
         .....

Вполне работает
 from pathlib import Path
for i in Path("data").glob("**/*.*"):
   ....

 {"creation_date":record["creation_date"], "fname":record["fname"], "lname":record["lname"], "code":record["code"], "value":record["value"]}
и
 record
Это одно и тоже. Зачем вам эта тавтология?

Вместо
   data = json.loads(handle.read())
            for record in data:
                jsonData.append(record)
Вполне работает
 jsonData+=data

Вместо
 handle = open(subFolderName+"/"+file, "r")
data = json.loads(handle.read())
handle.close()

обычно пишут:
 with open(i,"r") as f:
   data = json.load(f)
Areostar
Спасибо за обьяснение

только вот:

  data = json.loads(handle.read())
            for record in data:
                jsonData.append(record)

Не совсем подходит так как я не переписываю из файлов поле iв(в каждом файле начинается с 0) понятно что на деле это id и не нужно совсем, но раз уж токую задачу поставил надо и этот вопрос уяснить
Кстати а как мне добавить id каждой записи в итоговом файле?

Можно конечно определить переменную id=0 каждый раз добавлять и приращивать! Но может можно более элегантно?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB