Итерация в словаре для значения, которое соответствует первым 5 числам в имени файла - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь переименовать некоторые файлы, основываясь на информации о них, хранящейся в словаре json. Имена файлов в настоящее время похожи на «00016_930831_fa.png». У меня есть информация обо всех файлах, хранящихся в словаре, включая «факты», такие как имя (которое будет «00016_930831_fa_a») и «личные факты», такие как пол (который будет «мужской» или «женский»)).

Файл json выглядит так, где он содержит факты о файле:

json_data = {
    "images": 
    [        
        {
            "facts": 
            [                
                {
                    "relative": "data/images/00001/00001_930831_fa_a.ppm.bz2",
                    "disc": "1",
                    "pitch": "0",
                    "nose_coordinates": "268",
                    "subject": "cfrS00001",
                    "compression": "bzip2",
                    "yaw": "0",
                    "right_eye_coordinates": "202",
                    "environment": "cfrE00001",
                    "mouth_coordinates": "266",
                    "sensor": "cfrN00002",
                    "roll": "0",
                    "beard": "No",
                    "format": "ppm",
                    "pose": "fa",
                    "collection": "cfrC00001",
                    "illuminant": "cfrI00001",
                    "capture_time": "00:00:00",
                    "stage": "cfrT00001",
                    "capture_date": "08/31/1993",
                    "recording": "cfrR00002",
                    "weather": "inside",
                    "left_eye_coordinates": "326",
                    "expression": "fa",
                    "mustache": "No",
                    "glasses": "Yes"
                }
            ],
            "base": "00001_930831_fa_a",
            "person_facts": 
            [                
                {
                    "gender": "Male",
                    "race": "White",
                    "id": "cfrS00001",
                    "yob": "1943"
                }
            ],
            "root": "...data",
            "name": "00001"
        }
    ]
}

... но это данные только для одного изображения, есть сотни изображений.

Для каждого из файлов, которые я хочу переименовать (называемых «qual_images» в коде ниже), я хочу найти пол, связанный с этим файлом, через словарь, а затем я хочу добавить M (если мужчина) или F (если женщина) в начале имени файла.

Это мой код до сих пор. Код ошибки является ошибкой атрибута и говорит, что в списке нет атрибутируемого объекта «ключ».


data = json.load(open('data.json'))
# the data is in the form of the json shown above.

# choosing, and making a list of, the neutral expression files that we want to search the disctionary for

from os import listdir

directory = '...'

qualified_people = list(fname for fname in listdir(directory) if fname.endswith('.png'))
#this is a list of about 100 photos, where their filenames and information are also stored in the json dictionary

# iterate through dictionary - if it finds an image that matches the name of a file on the qualified_people list , then look at the gender and change the filename accordingly
# trying to rename Mirta's photos to have M or F in them
import json
import dlib
import numpy as np
from skimage import io
import csv
import pandas as pd
import os
import glob, os


os.chdir("/Users/charlottepeart/Documents/Part 2/Python/")

#opening the big dictionary with all info

data = json.load(open('data.json'))
#print(data)

# choosing, and making a list of, the neutral expression files that we want to search the disctionary for

from os import listdir

directory = '/Users/charlottepeart/Documents/Part 2/Python/images_for_python/Mitra_stuff_again'

qualified_people = list(fname for fname in listdir(directory) if fname.endswith('.png'))
#print(qualified_people)

# iterate through dictionary - if it finds an image that matches the qualified people, then look at the gender
for i in qualified_people:
    for j in data:
        if i == data.key(name): 
            if data.key(gender) == female:
                i.append(data['F'])
            else:
                i.append(data['M']) ```

1 Ответ

0 голосов
/ 20 октября 2019

Я обновил ваш ввод json в вашем вопросе, но то, что вы хотите, выглядит следующим образом

your json data below
json_data = {
    "images": 
    [        
        {
            "facts": 
            [                
                {
                    "relative": "data/images/00001/00001_930831_fa_a.ppm.bz2",
                    "disc": "1",
                    "pitch": "0",
                    "nose_coordinates": "268",
                    "subject": "cfrS00001",
                    "compression": "bzip2",
                    "yaw": "0",
                    "right_eye_coordinates": "202",
                    "environment": "cfrE00001",
                    "mouth_coordinates": "266",
                    "sensor": "cfrN00002",
                    "roll": "0",
                    "beard": "No",
                    "format": "ppm",
                    "pose": "fa",
                    "collection": "cfrC00001",
                    "illuminant": "cfrI00001",
                    "capture_time": "00:00:00",
                    "stage": "cfrT00001",
                    "capture_date": "08/31/1993",
                    "recording": "cfrR00002",
                    "weather": "inside",
                    "left_eye_coordinates": "326",
                    "expression": "fa",
                    "mustache": "No",
                    "glasses": "Yes"
                }
            ],
            "base": "00001_930831_fa_a",
            "person_facts": 
            [                
                {
                    "gender": "Male",
                    "race": "White",
                    "id": "cfrS00001",
                    "yob": "1943"
                }
            ],
            "root": "...data",
            "name": "00001"
        }
    ]
}

def json_add_prefix(json_data):
    for i in json_data['images']:
        if i['person_facts'][0]['gender'] == 'Male':
            i['facts'][0]['relative'] = '/'.join(i['facts'][0]['relative'].split('/')[:-1])+ '/M_' + i['facts'][0]['relative'].split('/')[-1]
        if i['person_facts'][0]['gender'] == 'Female':
             i['facts'][0]['relative'] = '/'.join(i['facts'][0]['relative'].split('/')[:-1])+ '/F_' + i['facts'][0]['relative'].split('/')[-1]
    return json_data

print(json_add_prefix(json_data))
'''
{'images': [{'facts': [{'relative': 'data/images/00001/M_00001_930831_fa_a.ppm.bz2', 'disc': '1', 'pitch': '0', 'nose_coordinates': '268', 'subject': 'cfrS00001', 'compression': 'bzip2', 'yaw': '0', 'right_eye_coordinates': '202', 'environment': 'cfrE00001', 'mouth_coordinates': '266', 'sensor': 'cfrN00002', 'roll': '0', 'beard': 'No', 'format': 'ppm', 'pose': 'fa', 'collection': 'cfrC00001', 'illuminant': 'cfrI00001', 'capture_time': '00:00:00', 'stage': 'cfrT00001', 'capture_date': '08/31/1993', 'recording': 'cfrR00002', 'weather': 'inside', 'left_eye_coordinates': '326', 'expression': 'fa', 'mustache': 'No', 'glasses': 'Yes'}], 'base': '00001_930831_fa_a', 'person_facts': [{'gender': 'Male', 'race': 'White', 'id': 'cfrS00001', 'yob': '1943'}], 'root': '...data', 'name': '00001'}]}
'''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...