Не удается обработать JSON-файлы в разных папках

#python #json #pandas #csv

#python #json #pandas #csv

Вопрос:

У меня есть следующая структура:

 /folder_1
    file_1.json
        json_1
        json_2
    file_2.json
        json_1
        ...
/folder_2
    file_1.json
        json_1
    file_2.json
        json_1
    file_3.json
        json_1
        json_2
...
  

Я перепробовал несколько способов чтения этих файлов: создать фрейм данных, где каждая строка является строкой из JSON-файлов. Кроме того, JSON-файлы не являются плоскими, поэтому они выглядят следующим образом:

  {
     "a": "1",
     "b": {
        "b_1": "val",
        "b_2": []
        ...
      },
      ...
 } 
  

Я попробовал следующее:

Для цикла

 for dirpath, dirnames, filenames in os.walk("/path/to/folders"):
    for json_f in filenames:
        print (json_f)
        json_file_path = os.path.join(dirpath, json_f)
        training_df = json_normalize(pd.Series(open(json_file_path). 
                                     readlines()).apply(json.loads))

print (training_df.count())
training_df.to_csv('training_data.csv')
  

В сценарии, где у меня есть 5 папок с 11 .json внутри и около 19 json-файлов внутри .файлы в формате json, программа может читать 11 файлов, но сгенерированный CSV содержит только 2 строки вместо 19.

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

1. Что значит иметь «19 json-файлов внутри . файлы json»? У вас не может быть «нескольких JSON-файлов в .json». Я имею в виду, что вы можете хранить там все, что захотите, поскольку это всего лишь текстовый файл, но, похоже, у вас недопустимые файлы JSON. Пожалуйста, приведите пример того, как для вас выглядит «несколько JSON-файлов внутри .json».

2. Привет @AlexanderReynolds, спасибо за ваш ответ! Я имею в виду, что каждая строка моего файла .json является новым json: {«a»: «1», «b»: «2» …} {«a»: «2», «b»: «5» …}

3. Хорошо, на самом деле это не допустимый файл JSON. Это текстовый файл в формате JSON lines (стандартно используется .jsonl расширение). НО ваша программа на самом деле работает в любом случае, поскольку вы выполняете json.loads() в каждой строке файла. Однако проблема в том, что вы перезаписываете training_df в каждом цикле. Вам нужно объединить эти фреймы данных. Проще всего создать пустой список и добавить к ним фреймы данных. Затем, как только цикл закончится, создайте свой окончательный фрейм данных с помощью df = pd.concat(list_of_dfs) . И отправьте это в CSV.

4. Я только что попробовал это, и, кажется, это работает, большое спасибо @AlexanderReynolds!