Только последний элемент списка файлов выводится с json .dump в python - PullRequest
0 голосов
/ 24 февраля 2020

Пробовал то же самое с 2 простыми списками - list1 = [1,2,3] и list2 =['a','b','c'], и код работает нормально.

Я извлекаю информацию о файлах как из файлов .json, так и из файлов .list и добавив эти данные в списки json_data и tables_data соответственно.

Мне нужно создать следующий формат вывода:

{
   "item1": {
       "json_data": "jsonfile1",
       "list_data": "listfile1"
   },
   "item2": {
       "json_data": "jsonfile2",
       "list_data": "listfile2"
   }
}

Однако мой код выводит информацию только из последние файлы в json_data и tables_data по какой-то причине, несмотря на добавление новой информации. Я также проверил длины обоих этих списков, поэтому похоже, что информация также добавлена ​​правильно.

Вот что я пытаюсь:

json_files = []
table_files = []

for subdir, dirs, files in os.walk(rootdir):

    for file in files:
        if file.endswith(".json"):
            json_files.append(os.path.join(subdir, file))
        if file.endswith(".list"):
            table_files.append(os.path.join(subdir, file))

    json_data = []
    for i in json_files:
        with open(i) as f:
            json_data.append(json.load(f))

    table_data = []
    for i in table_files:
        with open(i) as f:
            table_data.append([line.rstrip('\n') for line in f]) 

    my_dict = {
        subdir: {
            "json_data": j,
            "table_data": t,
        } 
        for (j, t) in zip(json_data, table_data)
    }

with open('summary.json', 'w') as f:
    json.dump(my_dict, f, indent=2)

Любая идея о том, что здесь не так и что мне нужно сделать, чтобы это исправить?

1 Ответ

1 голос
/ 24 февраля 2020

Вы записываете результат последней итерации в выходной файл. Таким образом, вы получаете только эту информацию в выводе. my_dict переписывается в каждой итерации.

Вам необходимо добавить в список my_dict s, чтобы сохранить все результаты.

json_files = []
table_files = []

my_dicts = []

for subdir, dirs, files in os.walk(rootdir):

    for file in files:
        if file.endswith(".json"):
            json_files.append(os.path.join(subdir, file))
        if file.endswith(".list"):
            table_files.append(os.path.join(subdir, file))

    json_data = []
    for i in json_files:
        with open(i) as f:
            json_data.append(json.load(f))

    table_data = []
    for i in table_files:
        with open(i) as f:
            table_data.append([line.rstrip('\n') for line in f])

    my_dict = {
        subdir: {
            "json_data": j,
            "table_data": t,
        }
        for (j, t) in zip(json_data, table_data)
    }
    # save the result of this iteration
    my_dicts.append(my_dict)

with open('summary.json', 'w') as f:
    # write complete output to output file
    json.dump(my_dicts, f, indent=2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...