Python—是否可以动态生成函数

Python—是否可以动态生成函数,python,xml,function,spawn,Python,Xml,Function,Spawn,是否可以动态生成函数 我编写了一个函数来解析这个example.xml文件,并将segment_1元素的属性作为列表返回。 现在,这个示例包含四个段,但是这将针对不同的资产进行更改,一个只能有一个段,另一个可以有10+ 以下是示例XML,它有四个部分: <?xml version="1.0" encoding="utf-8"?> <manifest task_id="00000000112"> <asset_metadata> <materi

是否可以动态生成函数

我编写了一个函数来解析这个example.xml文件,并将segment_1元素的属性作为列表返回。 现在,这个示例包含四个段,但是这将针对不同的资产进行更改,一个只能有一个段,另一个可以有10+

以下是示例XML,它有四个部分:

<?xml version="1.0" encoding="utf-8"?>
<manifest task_id="00000000112">
  <asset_metadata>
    <material_id>LB000001</material_id>
    <series_title>test asset 1</series_title>
    <season_title>Number 1</season_title>
    <season_number>1</season_number>
    <episode_title>ET 1</episode_title>
    <episode_number>1</episode_number>
    <start_date>18-11-2016</start_date>
    <end_date>30-11-2016</end_date>
    <ratings>15</ratings>
    <synopsis>This is a test asset</synopsis>
  </asset_metadata>
  <file_info>
    <source_filename>LB000001</source_filename>
    <number_of_segments>4</number_of_segments>
    <segment_1 seg_1_in="00:00:00.000" seg_1_out="00:01:00.000" seg_1_dur="00:01:00.000"/>
    <segment_2 seg_2_in="00:02:00.000" seg_2_out="00:03:00.000" seg_2_dur="00:01:00.000"/>
    <segment_3 seg_3_in="00:04:00.000" seg_3_out="00:05:00.000" seg_3_dur="00:01:00.000"/>
    <segment_4 seg_4_in="00:06:00.000" seg_4_out="00:07:00.000" seg_4_dur="00:01:00.000"/>
    <conform_profile definition="hd" aspect_ratio="16f16">ffmpeg -progress LOG_FILE.txt -i S_PATH/F_NAME.mp4 SEG_CONFORM</conform_profile>
    <transcode_profile profile_name="amazon" package_type="tar">ffmpeg -safe 0 -progress LOG_FILE.txt -f concat -i T_PATH/CONFORM_LIST TRC_PATH/F_NAME.mp4</transcode_profile>
    <target_path>F:/profiles/amazon</target_path>
  </file_info>
</manifest>
在parse_xml函数中,根据资源有多少段

以下是功能:

import xml.etree.ElementTree as et
file = 'example.xml'

# Seg_element
def seg_element(xml_root, element_path):
    list_a = []
    for elem in xml_root.iterfind(element_path):
        a = elem.attrib
        for i in a:
            list_a.append([i + ' = ' + a[i]])
        return list_a

# Parse_xml
def parse_xml(file_input, number_of_segments):
    tree = et.parse(file_input)
    root = tree.getroot()
    path = 'file_info/segment_1'

    return seg_element(root, path)


for i in parse_xml(file, 1):
    print(i)
以下是输出:

['seg_1_dur = 00:01:00.000']
['seg_1_in = 00:00:00.000']
['seg_1_out = 00:01:00.000']
seg_元素的每次迭代所创建的列表的名称可能会有所不同


这样做的原因是为了创建一个要提交到FFMPEG的命令,下面是创建该命令的70行if语句

无需生成函数,您只需对段数进行循环,并相应地调用seg_元素函数:

def parse_xml(file_input, number_of_segments):
    tree = et.parse(file_input)
    root = tree.getroot()
    segments_no = int(root.find('file_info/number_of_segments').text)
    segments = []   

    for i in range(segments_no):
        path = 'file_info/segment_%d' % (i+1)
        segments.append(seg_element(root, path))

    return segments

上面的代码没有经过测试,但我想你会明白的

我不明白。从你的例子中删去多余的垃圾。如果你提到的话,请展示70线的一部分。我必须问一下,为什么最终结果会是这样?看起来你的打印效果很好。有关详细信息,请参阅编辑。感谢您的帮助,在我测试它时,它起到了作用。创建了4个列表,其中包含所有正确的数据。
['seg_1_dur = 00:01:00.000']
['seg_1_in = 00:00:00.000']
['seg_1_out = 00:01:00.000']
def parse_xml(file_input, number_of_segments):
    tree = et.parse(file_input)
    root = tree.getroot()
    segments_no = int(root.find('file_info/number_of_segments').text)
    segments = []   

    for i in range(segments_no):
        path = 'file_info/segment_%d' % (i+1)
        segments.append(seg_element(root, path))

    return segments