#python #json #string #list #parsing
Вопрос:
У меня есть JSON, который содержит дикт [«потоки»] и список [«формат»] То, что я хочу сделать, это что-то вроде этого, но для строк, а не для диктатора:
for s in clean_result['streams']:
stream = MediaStreams.objects.create(
index=s.get('index'),
stream_bitrate=s.get('bit_rate'),
codec_name=s.get('codec_name'),
codec_type=s.get('codec_type'),
width=s.get('width'),
height=s.get('height'),
channel_layout=s.get('channel_layout'),
language=s.get("tags", {'x': None}).get("language"),
media=new_object
)
Единственное решение, которое я смог найти, например:
if 'filename' in clean_result['format']:
filename_value = str(clean_result['format']['filename'])
Есть ли какой-нибудь способ преобразовать список в диктант, а также перебирать ключи, как я уже делаю это для [‘потоков’].
Возьмем в качестве примера следующий JSON:
{
"streams": [{
"index": 0,
"codec_name": "h264",
"codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
"profile": "High",
"codec_type": "video",
"codec_time_base": "1001/48000",
"codec_tag_string": "avc1",
"codec_tag": "0x31637661",
"width": 1920,
"height": 1080,
"coded_width": 1920,
"coded_height": 1088,
"closed_captions": 0,
"has_b_frames": 2,
"sample_aspect_ratio": "1:1",
"display_aspect_ratio": "16:9",
"pix_fmt": "yuv420p",
"level": 40,
"chroma_location": "left",
"refs": 1,
"is_avc": "true",
"nal_length_size": "4",
"r_frame_rate": "24000/1001",
"avg_frame_rate": "24000/1001",
"time_base": "1/24000",
"start_pts": 2002,
"start_time": "0.083417",
"duration_ts": 201591390,
"duration": "8399.641250",
"bit_rate": "5139983",
"bits_per_raw_sample": "8",
"nb_frames": "201390",
"disposition": {
"default": 1,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0,
"timed_thumbnails": 0
},
"tags": {
"creation_time": "2021-06-04T09:30:43.000000Z",
"language": "deu",
"handler_name": "VideoHandler"
}
},
{
"index": 1,
"codec_name": "eac3",
"codec_long_name": "ATSC A/52B (AC-3, E-AC-3)",
"codec_type": "audio",
"codec_time_base": "1/48000",
"codec_tag_string": "ec-3",
"codec_tag": "0x332d6365",
"sample_fmt": "fltp",
"sample_rate": "48000",
"channels": 6,
"channel_layout": "5.1(side)",
"bits_per_sample": 0,
"dmix_mode": "-1",
"ltrt_cmixlev": "-1.000000",
"ltrt_surmixlev": "-1.000000",
"loro_cmixlev": "-1.000000",
"loro_surmixlev": "-1.000000",
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"time_base": "1/48000",
"start_pts": 0,
"start_time": "0.000000",
"duration_ts": 403201536,
"duration": "8400.032000",
"bit_rate": "640000",
"nb_frames": "262501",
"disposition": {
"default": 1,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0,
"timed_thumbnails": 0
},
"tags": {
"creation_time": "2021-06-04T09:30:43.000000Z",
"language": "eng",
"handler_name": "SoundHandler"
},
"side_data_list": [{
"side_data_type": "Audio Service Type"
}]
}
],
"format": {
"filename": "SomeFile.mp4",
"nb_streams": 6,
"nb_programs": 0,
"format_name": "mov,mp4,m4a,3gp,3g2,mj2",
"format_long_name": "QuickTime / MOV",
"start_time": "0.000000",
"duration": "8400.031958",
"size": "6079598809",
"bit_rate": "5790072",
"probe_score": 100,
"tags": {
"major_brand": "M4V ",
"minor_version": "512",
"compatible_brands": "mp42iso6",
"creation_time": "2021-06-04T09:30:43.000000Z",
"iTunEXTC": "de-movie|ab 12 Jahren|300|",
"iTunMOVI": "<?xml version="1.0" encoding="UTF-8"?>n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">n<plist version="1.0">n<dict>nt<key>cast</key>nt<array>ntt<dict>nttt<key>name</key>nttt<string>Christian</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Michael</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Liam</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Katie</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Gary</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Cillian</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Tom</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Peter</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Ken</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Steven</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Linus</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Morgan</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Larry</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Gerard</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Colin</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Sara</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Gus</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>...</string>ntt</dict>nt</array>nt<key>directors</key>nt<array>ntt<dict>nttt<key>name</key>nttt<string>Christopher</string>ntt</dict>nt</array>nt<key>producers</key>nt<array>ntt<dict>nttt<key>name</key>nttt<string>Larry</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Charles</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Emma</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>Lorne</string>ntt</dict>nt</array>nt<key>screenwriters</key>nt<array>ntt<dict>nttt<key>name</key>nttt<string>Christopher</string>ntt</dict>ntt<dict>nttt<key>name</key>nttt<string>David</string>ntt</dict>nt</array>nt<key>studio</key>nt<string>Studio XYZ </string>n</dict>n</plist>n",
"title": "Kaiser Saw",
"artist": "Mira Young",
"genre": "Action, Krimi, Drama",
"date": "2005-01-10",
"track": "1/1",
"disc": "1/1",
"synopsis": "Some more content here",
"copyright": "© 2021 some copyright stuff here",
"hd_video": "2",
"media_type": "9"
}
}
}
В конце концов, я хочу сохранить значения в таблице базы данных, например:
if not Media.objects.filter(filename=filename_value).exists():
for i in clean_result['format']:
new_object = Media.objects.create(filename=i.get('filename'),
bitrate=i.get('bit_rate'),
…
Но использование i.get невозможно, так как это строка, а не дикт.
Может ли помочь smb? Заранее спасибо
Комментарии:
1. Почему вы хотите преобразовать список в диктант?
2. Есть
dict.fromkeys()
, но я не вижу причин использовать его здесь.3. Можете ли вы объяснить, каким должен быть ваш результат?
4.
streams
это не диктат. Это список.streams[0]
это диктат. Так и естьformat
. Вам нужно четко провести это различие, чтобы общаться без путаницы. Во всяком случае, что касается вашего уродливого кода. Часто бывает так, что реорганизация иерархий данных приводит к утомительному коду, но ваш, вероятно, излишне утомителен.5. Обратите внимание, что в исходном цикле вы используете
get
вместо выражения подстрочного индекса для поиска ключей. Это позволяет избежать необходимостиif
в заявлениях. Это не имеет никакого отношения к циклу. Вам не нужен цикл для использованияget
; это метод типа dict.