Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 22, 2019 23:12:19

Areostar
Зарегистрирован: 2018-06-27
Сообщения: 164
Репутация: +  0  -
Профиль   Отправить e-mail  

чтение json фаилов

имеется каталог в который вложнно несколько других. в каждом из клоторых находитсяпо одному или больше 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” }

как надо решать эту задачу?

Отредактировано Areostar (Июнь 22, 2019 23:13:27)

Офлайн

#2 Июнь 23, 2019 00:26:09

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

чтение json фаилов

Основная сложность в определении что именно значит это

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



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Июнь 23, 2019 04:41:23

Areostar
Зарегистрирован: 2018-06-27
Сообщения: 164
Репутация: +  0  -
Профиль   Отправить e-mail  

чтение json фаилов

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

придётся распарсивать ручками? Быстрее неполучиться?

Офлайн

#4 Июнь 23, 2019 08:12:45

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

чтение json фаилов

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 или базе данных



Отредактировано doza_and (Июнь 23, 2019 08:32:08)

Офлайн

#5 Июнь 23, 2019 13:14:36

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

чтение json фаилов

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



Отредактировано py.user.next (Июнь 23, 2019 13:15:23)

Офлайн

#6 Июнь 24, 2019 22:10:00

Areostar
Зарегистрирован: 2018-06-27
Сообщения: 164
Репутация: +  0  -
Профиль   Отправить e-mail  

чтение json фаилов

И так начнём с начала:

на данный момент у меня 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, обьединить массивы и конвертнуть обратно

Офлайн

#7 Июнь 24, 2019 22:12:57

Areostar
Зарегистрирован: 2018-06-27
Сообщения: 164
Репутация: +  0  -
Профиль   Отправить e-mail  

чтение json фаилов

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

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

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

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

Офлайн

#8 Июнь 24, 2019 22:35:09

Areostar
Зарегистрирован: 2018-06-27
Сообщения: 164
Репутация: +  0  -
Профиль   Отправить e-mail  

чтение 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:
        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)

Офлайн

#9 Июнь 24, 2019 23:26:33

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

чтение json фаилов

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)



Отредактировано doza_and (Июнь 24, 2019 23:27:09)

Офлайн

#10 Июнь 25, 2019 04:03:04

Areostar
Зарегистрирован: 2018-06-27
Сообщения: 164
Репутация: +  0  -
Профиль   Отправить e-mail  

чтение json фаилов

Спасибо за обьяснение

только вот:

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

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

Можно конечно определить переменную id=0 каждый раз добавлять и приращивать! Но может можно более элегантно?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version