Я пытаюсь программировать в Python скрипт, который автоматически генерирует XML файл с некоторой информацией там.
Поэтому я застрял на Точке. У меня 6 подэлементов. Текст подэлемента может быть 0 или 1. Я хочу напечатать все возможности для 6 элементов.
Что я имею:
listTCPFlag["fin","syn","rst","psh","ack","urg"]
lustTCPFlagAnswer = [0,1]
listProtocol = ['TCP','UDP','ICMP']
top = Element('Test')
ipHeader = SubElement(top, 'IpHeader')
ipProtocol = SubElement(ipHeader,'protocol')
for x in range(len(listProtocol)):
ipProtocol.text = str(listProtocol[x])
if(ipProtocol.txt == "TCP"):
tcpHeader = SubElement(top, "tcpHeader")
tcpPort = SubElement(tcpHeader,"destPort")
tcpFlag = SubElement(tcpHeader, "flag")
tcpFlagFin = SubElement(tcpFlag, "fin")
tcpFlagSyn = SubElement(tcpFlag, "syn")
tcpFlagRst = SubElement(tcpFlag, "rst")
tcpFlagPsh = SubElement(tcpFlag, "psh")
tcpFlagAck = SubElement(tcpFlag, "ack")
tcpFlagUrg = SubElement(tcpFlag, "urg")
# I tried to implement this in a for loop:
for z in range(len(listTCPFlag)):
for u in range(len(listTCPFlagAnswer)):
if(listTCPFlag[z] == "fin"):
tcpFlagFin.text = str(listTCPFlagAnswer[u])
# ...
После тщательного рассмотрения и тестирования я обнаружил, что цикл неправильный. И теперь у меня пропал мысли и не знаю, как я могу исправить эту проблему. Мой вывод должен выглядеть так:
Пример:
<root>
<element_1> 0 </element_1>
<element_2> 0 </element_2>
<element_3> 0 </element_3>
<element_4> 0 </element_4>
<element_5> 0 </element_5>
<element_6> 0 </element_6>
</root>
<root>
<element_1> 0 </element_1>
<element_2> 0 </element_2>
<element_3> 0 </element_3>
<element_4> 0 </element_4>
<element_5> 0 </element_5>
<element_6> 1 </element_6>
</root>
<root>
<element_1> 0 </element_1>
<element_2> 0 </element_2>
<element_3> 0 </element_3>
<element_4> 0 </element_4>
<element_5> 1 </element_5>
<element_6> 0 </element_6>
</root>
<root>
<element_1> 0 </element_1>
<element_2> 0 </element_2>
<element_3> 0 </element_3>
<element_4> 1 </element_4>
<element_5> 0 </element_5>
<element_6> 0 </element_6>
</root>
....
(в конце концов)
<root>
<element_1> 1 </element_1>
<element_2> 1 </element_2>
<element_3> 1 </element_3>
<element_4> 1 </element_4>
<element_5> 1 </element_5>
<element_6> 1 </element_6>
</root>
После этого я попробую его с помощью функции "add_binary_nums (x, y)". Например: https://www.w3resource.com/python-exercises/challenges/1/python-challenges-1-exercise-31.php
Для моего мнения я предпочитаю for-loop, который может справиться с этим. Но у меня нет идеи, как она может быть построена. Как я могу сделать это просто в Python 2 и в For-loop?
Самый сжатый способ сделать это, о котором я могу думать, - написать цикл for
который выполняет итерацию по всем числам от 0
до 63
(2^6 - 1
) в двоичном формате, поскольку это будет идти от 000000
до 111111
. Затем разделите каждое число на отдельные цифры и поместите каждую цифру в один из тэгов <element>
.
Вот пример:
all_possibilities = []
for n in range(2**6):
binary = format(n, '06b')
tcp_flag_elements = []
for i in range(len(binary)):
subelement = SubElement(tcpFlag, listTCPFlag[i])
subelement.text = binary[i]
tcp_flag_elements.append(subelement)
all_possibilities.append(tcp_flag_elements)
Это оставит вам список all_possibilities
содержащий 64 списка, по одному для каждой из возможных конфигураций ваших подэлементов.
06b
быть 0:b
?
str.format
, но здесь этот format
является немного более прямым способом преобразования n
в двоичный файл. В частности, значение 6
важно, чтобы все двоичные числа имели одинаковую длину, а значение 0
говорит о том, чтобы заполнить пространство 0
, так что, например, 2
получается как 000010
вместо просто 10
.
010000
вместо000001
? Вы хотите их в рандомизированном порядке?