#python #json #xml #dataframe #dictionary
#python #json #xml #фрейм данных #словарь
Вопрос:
У меня есть источник из XML-файла, а затем я преобразовал dict
его так :
data= {
"Head": {
"@xmlns": "http://www...",
"@xmlns:xsi": "http://www...",
"@xsi:schemaLocation": "http://www...",
"Header": {
"Num": " ",
"Type": {
"source": "user",
"text": "Training"
},
"FNum": "SSSSS",
"FDate": "2020-10-02T04:30:00Z",
"From": "ABC",
"To": "DEF",
"AC": "AAAA",
"Reg": "BBBB"
},
"AdditionalComment": " ", #Cause of problem!
"Period": {
"Duration": " ",
"LOL": "false"
}
}
}
Первоначально в xml это выглядит так (я не могу их изменить) :
.....
<Header>
......
</Header>
<AdditionalComment/> # Focus here
<Period>
<Duration/>
<LOL>false</LOL>
</Period>
</Head>
Мой код работает отлично, если я исключаю AdditionalComment
, но я не могу исключить их по некоторым причинам. Однако я получу эту ошибку, если я ВКЛЮЧУ AdditionalComment
:
if any([isinstance(x, dict) for x in y.values()] for y in data): AttributeError: 'str' object has no attribute 'values'
at pd.json_normalize
. Я тестировал путем замены значений, также не работает.
Ниже приведены мои текущие коды:
# Replacing None to other values
def replaceNone(data_dict,v,rv):
for key1 in data_dict.keys():
if data_dict[key1] == v:
data_dict[key1] = rv
elif type(data_dict[key1]) is dict:
replaceNone(data_dict[key1],v,rv)
with open('test_file.xml') as fd:
doc = xmltodict.parse(fd.read())
data = json.dumps(doc)
data = json.loads(data)
replaceNone(data,None," ")
# Get list of key for next iteration
key_list = []
for l_key, l_value in data.items():
for n_key, n_value in l_value.items():
# Exclude unnecessary key from the list
if n_key == '@xmlns' or n_key == '@xmlns:xsi' or n_key == '@xsi:schemaLocation' or n_key == 'AdditionalComment':
continue
else:
key_list.append(n_key)
# Join flatten dictionary to a new dataframe
for key, value in data.items():
k = 0
for idx in key_list:
data_df = pd.json_normalize(data[key][idx]) #HITTING ERROR HERE
if k==0:
final_df = data_df
else:
final_df = final_df.join(data_df, lsuffix='_left')
k = 1