Объекты процесса Python в массиве JSON на основе условия

#python #arrays #json #object #nested

Вопрос:

Мне нужно обработать 10 тыс. файлов JSON в папке «All_Files», имеющей имена Result_1.json, Result_2.json и так далее, и имеющей следующую структуру:

 {
    "kind": "string",
    "url": {
        "type": "application/json",
        "template": "string"
    },
    "items": [
        {
            "kind": "string",
            "link": "https://www.somewhere.com/..."            
        },
        {
            "kind": "string",
            "link": "https://www.anywhere.com/..."            
        },
        {
            "kind": "string",
            "link": "https://www.nowhere.com/..."            
        },
        ...
        
        }
    ]
}
 

Следует отметить, что один файл JSON может содержать или не содержать массив «элементы». Кроме того, если массив «элементы» присутствует, то он может содержать один или несколько объектов, как показано в приведенном выше примере. Ключ «ссылка» содержит полные URL-адреса. Если массив «элементы» присутствует, то мне нужно получить доступ к ключу «ссылка» и выполнить поиск определенной подстроки, которая начинается с «https://www.nowhere.com». Там может быть дополнительная строка после «https://www.nowhere.com» в «ссылке» ключ, но мне нужно сопоставить только первую часть, как описано. Если первая часть совпадает, нам нужно сохранить имя файла .JSON, имеющего это конкретное значение ключа, в текстовом файле под названием «Found.txt», одно имя файла без кавычек в каждой строке файла.

Пожалуйста, помогите мне в написании скрипта на Python, который делает это.

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

1. Пожалуйста, поделитесь, что вы пытались сделать, что вы обнаружили, исследуя свою проблему?

2. Это часть большой исследовательской проблемы, частью которой я являюсь. Мы анализируем ответы различных поисковых систем по некоторым заданным критериям.

3. Я уже дал вам ответ как идею для решения ваших проблем, но если бы вы предоставили какой-то код, который вы пробовали, тогда я, возможно, также дал вам какой-то код, но вы не представили ничего, что вы пробовали, так что делайте сами!

Ответ №1:

Для получения списка файлов и их открытия вы можете это сделать, но это будет работать только в том случае, если у вас есть файлы jsons только в этом каталоге.

 import os 
print(os.listdir("/path/to/All_Files"))
 

И теперь у вас есть имена всех файлов в этом каталоге, вы можете открыть эти файлы с помощью любого json или просто with .

Пройдите по всем файлам, прочитайте файлы и измените тип данных содержимого файла, чтобы str с помощью content=str(content) содержимого сделать данные внутри файла, которые мы уже прочитали и сохранили в содержимом. и теперь у вас есть данные в каждой итерации. Добавьте этот код в цикл:

 pattern=r"(?i)(b(https?|http)://[-A-Z0-9 amp;@#/%?=~_|!:,.;]*[-A-Z0-9 amp;@#/%=~_|])"

urls=[x[0] for x in re.findall(pattern,content)]

if "https://www.nowhere.com/" in urls:
    with open("found.txt","a ") as f:
        f.write(f"Found in {<file name we got previously using os.listdir()>}")
 

Мы использовали re так, что не забудьте импортировать его в свою программу.