Проблема чтения нескольких файлов json и создания фрейма данных

#python #json #pandas #dataframe

Вопрос:

Я пытаюсь создать фрейм данных, считывающий несколько файлов json, но программа считывает только один из этих файлов. Я получаю нужные мне данные, но только из этого одного файла. Знаете ли вы, как я могу прочитать все эти файлы и объединить их в один кадр данных? Я не получаю никаких ошибок при запуске этой программы. Вот код:

 import json
import pandas as pd
import os



path = 'C:\Users\sotir\Desktop\machinedataset'

filenames = os.listdir(path)
for filename in sorted(filenames):
    if filename.startswith("mpd.slice") and filename.endswith(".json"):
        fullpath = os.sep.join((path, filename))
        f = open(fullpath)
        js = json.load(f)
        f.close()


df= pd.json_normalize(js['playlists'], meta=['name', 'collaborative', 'pid', 'modified_at','num_tracks', 'num_albums', 
                                              'num_followers', 'num_edits', 'duration_ms', 'num_artists'],record_path= ['tracks'],
                       record_prefix='_')
 

Вот часть одного файла json:

 {
    "info": {
        "generated_on": "2017-12-03 08:41:42.057563", 
        "slice": "0-999", 
        "version": "v1"
    }, 
    "playlists": [
        {
            "name": "Throwbacks", 
            "collaborative": "false", 
            "pid": 0, 
            "modified_at": 1493424000, 
            "num_tracks": 52, 
            "num_albums": 47, 
            "num_followers": 1, 
            "tracks": [
                {
                    "pos": 0, 
                    "artist_name": "Missy Elliott", 
                    "track_uri": "spotify:track:0UaMYEvWZi0ZqiDOoHU3YI", 
                    "artist_uri": "spotify:artist:2wIVse2owClT7go1WT98tk", 
                    "track_name": "Lose Control (feat. Ciara amp; Fat Man Scoop)", 
                    "album_uri": "spotify:album:6vV5UrXcfyQD1wu4Qo2I9K", 
                    "duration_ms": 226863, 
                    "album_name": "The Cookbook"
                }, 
                {
                    "pos": 1, 
                    "artist_name": "Britney Spears", 
                    "track_uri": "spotify:track:6I9VzXrHxO9rA9A5euc8Ak", 
                    "artist_uri": "spotify:artist:26dSoYclwsYLMAKD3tpOr4", 
                    "track_name": "Toxic", 
                    "album_uri": "spotify:album:0z7pVBGOD7HCIB7S8eLkLI", 
                    "duration_ms": 198800, 
                    "album_name": "In The Zone"
                }, 
                
            ], 
            "num_edits": 6, 
            "duration_ms": 11532414, 
            "num_artists": 37
        }, 
 

Комментарии:

1. Структура вашего кода такова, что строка df=pd.normalize(...) запускается только после того, как цикл по именам файлов полностью завершен. Это означает, что js он будет содержать только содержимое самого последнего файла в цикле. Похоже, вам придется создать df его заранее, а затем обновлять его с каждым js .

2. Имеют ли все эти файлы Json одинаковую структуру?

3. да структура та же самая

Ответ №1:

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

 data = [] # Here is your list
filenames = os.listdir(path)
for filename in sorted(filenames):
    if filename.startswith("mpd.slice") and filename.endswith(".json"):
        fullpath = os.sep.join((path, filename))
        f = open(fullpath)
        data.append(json.load(f)) # here data keeps the loaded json
        f.close()
 

После этого вы можете использовать список данных для создания своей базы данных

Комментарии:

1. Спасибо за ваш ответ, я обновил свой код, но я получаю ошибку. Я добавил код в качестве ответа.