#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. Спасибо за ваш ответ, я обновил свой код, но я получаю ошибку. Я добавил код в качестве ответа.