#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!