изменения выходных данных при добавлении словарных данных в список в Python - PullRequest
0 голосов
/ 02 октября 2018

У меня есть словарь, содержащий данные в определенном формате.Когда я печатаю словари по отдельности, они печатают данные правильно, но когда я добавляю все словари в список, а затем распечатываю список, он печатает неверный вывод.Могу ли я узнать решение этой проблемы?

мой код:

import glob
import os
list_for_dictionary = []
list_for_dictionary_2 = []

data_location = 'D:\\sample_data'  # folder containing all the data
for root, directories, files in os.walk(data_location):
    for directory in directories:
        loc = (data_location + '/' + directory + '/*')
        all_files = glob.glob(loc)
        for filename in all_files:
            list_for_dictionary.clear()
            f = open(filename) 
            for line_number, line in enumerate(f, 1):
                dictionary = {"fileLine": line.strip(), "lineNumber": int(line_number), "fileName": filename.split("\\")[-1]}
                list_for_dictionary.append(dictionary)

            dictionary_2={"collection":[], "documentName":filename.split("\\")[-1],"returnId":0,"docData":{"Matches":list_for_dictionary}}
            print(dictionary_2)
            list_for_dictionary_2.append(dictionary_2)
print(list_for_dictionary_2)

Ожидаемый результат:

[{'collection': [], 'documentName': 'sample.txt', 'returnId': 0, 'docData': {'Matches': [{'fileLine': 'Name of Person: John', 'lineNumber': 1, 'fileName': 'sample.txt'}, {'fileLine': 'Age: 24 years', 'lineNumber': 2, 'fileName': 'sample.txt'}]}}
{'collection': [], 'documentName': 'sample2.txt', 'returnId': 0, 'docData': {'Matches': [{'fileLine': 'Name of Person: Matthews', 'lineNumber': 1, 'fileName': 'sample2.txt'}, {'fileLine': 'Age: 32 years', 'lineNumber': 2, 'fileName': 'sample2.txt'}]}}
{'collection': [], 'documentName': 'sample3.txt', 'returnId': 0, 'docData': {'Matches': [{'fileLine': 'Name of Person: Alisa', 'lineNumber': 1, 'fileName': 'sample3.txt'}, {'fileLine': 'Age: 40 years', 'lineNumber': 2, 'fileName': 'sample3.txt'}]}}
{'collection': [], 'documentName': 'sample4.txt', 'returnId': 0, 'docData': {'Matches': [{'fileLine': 'Name of Person: Jacob', 'lineNumber': 1, 'fileName': 'sample4.txt'}, {'fileLine': 'Age: 60 years', 'lineNumber': 2, 'fileName': 'sample4.txt'}]}}]

Мой результат:

[{'collection': [], 'documentName': 'sample.txt', 'returnId': 0, 'docData': {'Matches': [{'fileLine': 'Name of Person: Jacob', 'lineNumber': 1, 'fileName': 'sample4.txt'}, {'fileLine': 'Age: 60 years', 'lineNumber': 2, 'fileName': 'sample4.txt'}]}},
{'collection': [], 'documentName': 'sample2.txt', 'returnId': 0, 'docData': {'Matches': [{'fileLine': 'Name of Person: Jacob', 'lineNumber': 1, 'fileName': 'sample4.txt'}, {'fileLine': 'Age: 60 years', 'lineNumber': 2, 'fileName': 'sample4.txt'}]}}, 
{'collection': [], 'documentName': 'sample3.txt', 'returnId': 0, 'docData': {'Matches': [{'fileLine': 'Name of Person: Jacob', 'lineNumber': 1, 'fileName': 'sample4.txt'}, {'fileLine': 'Age: 60 years', 'lineNumber': 2, 'fileName': 'sample4.txt'}]}}, 
{'collection': [], 'documentName': 'sample4.txt', 'returnId': 0, 'docData': {'Matches': [{'fileLine': 'Name of Person: Jacob', 'lineNumber': 1, 'fileName': 'sample4.txt'}, {'fileLine': 'Age: 60 years', 'lineNumber': 2, 'fileName': 'sample4.txt'}]}}]

1 Ответ

0 голосов
/ 03 октября 2018

Это похоже на ошибку ссылки.Вы выполняете "docData":"Matches":list_for_dictionary}}, а затем переписываете list_for_dictionary в последующих циклах.

Инициализируйте новый list_for_dictionary = [] вместо очистки list_for_dictionary.clear()

import glob
import os
list_for_dictionary = []
list_for_dictionary_2 = []

data_location = 'D:\\sample_data'  # folder containing all the data
for root, directories, files in os.walk(data_location):
    for directory in directories:
        loc = (data_location + '/' + directory + '/*')
        all_files = glob.glob(loc)
        for filename in all_files:
            list_for_dictionary = []
            f = open(filename) 
            for line_number, line in enumerate(f, 1):
                dictionary = {"fileLine": line.strip(), "lineNumber": int(line_number), "fileName": filename.split("\\")[-1]}
                list_for_dictionary.append(dictionary)

            dictionary_2={"collection":[], "documentName":filename.split("\\")[-1],"returnId":0,"docData":{"Matches":list_for_dictionary}}
            print(dictionary_2)
            list_for_dictionary_2.append(dictionary_2)
print(list_for_dictionary_2)
...