[英]Python list to XML and vice versa
我有一些python代碼,我寫了將python列表轉換為XML元素。 它用於與LabVIEW交互,因此是奇怪的XML數組格式。 無論如何,這是代碼:
def pack(data):
# create the result element
result = xml.Element("Array")
# report the dimensions
ref = data
while isinstance(ref, list):
xml.SubElement(result, "Dimsize").text = str(len(ref))
ref = ref[0]
# flatten the data
while isinstance(data[0], list):
data = sum(data, [])
# pack the data
for d in data:
result.append(pack_simple(d))
# return the result
return result
現在我需要編寫一個unpack()方法來將打包的XML Array轉換回python列表。 我可以很好地提取數組維度和數據:
def unpack(element):
# retrieve the array dimensions and data
lengths = []
data = []
for entry in element:
if entry.text == "Dimsize":
lengths.append(int(entry.text))
else:
data.append(unpack_simple(entry))
# now what?
但我不知道如何解開陣列。 什么是有效的方法呢?
編輯:這是python列表和相應的XML的樣子。 注意:數組是n維的。
data = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
然后是XML版本:
<Array>
<Dimsize>2</Dimsize>
<Dimsize>2</Dimsize>
<Dimsize>2</Dimsize>
<I32>
<Name />
<Val>1</Val>
</I32>
... 2, 3, 4, etc.
</Array>
實際格式並不重要,我只是不知道如何從列表中取消:
data = [1, 2, 3, 4, 5, 6, 7, 8]
回到:
data = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
給定:
lengths = [2, 2, 2]
假設pack_simple()和unpack_simple()對pack()和unpack()執行與基本數據類型(int,long,string,boolean)相同的操作。
從里到外:
def group(seq, k):
return [seq[i:i+k] for i in range(0, len(seq), k)]
unflattened = group(group(data, 2), 2)
如果您的尺寸不盡相同,那么您的示例可能會更容易。 但我認為上面的代碼應該可行。
請嘗試以下方法:
from operator import mul
def validate(array, sizes):
if reduce(mul, sizes) != len(array):
raise ValueError("Array dimension incompatible with desired sizes")
return array, sizes
def reshape(array, sizes):
for s in sizes:
array = [array[i:i + s] for i in range(0, len(array), s)]
return array[0]
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
length = [2, 2, 3]
print reshape(validate(data, length))
length = [2, 2, 2]
print reshape(validate(data, length))
輸出為:
[[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]]
Traceback:
(...)
ValueError: Array dimension incompatible with desired sizes
另一種方法是使用numpy
數組。 請注意,對於這個簡單的任務,numpy是一個相當大的依賴,但你會發現大多數(常見的)數組相關的任務/問題已經在那里有一個實現:
from numpy import array
print array(data).reshape(*length) # optionally add .tolist() to convert to list
編輯 :添加數據驗證
編輯 :使用numpy數組的示例(感謝JFSebastian的提示)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.