2016-11-18 12 views
-1

関数を動的に生成することは可能ですか?Python - 関数を動的に生成することは可能ですか?

このexample.xmlファイルを解析し、segment_1要素の属性をリストとして返す関数を記述しました。 この例には4つのセグメントが含まれていますが、これは異なる資産に対して変更されます.1つのセグメントは1つしかなく、別のセグメントは10+を持つことができます。私は、最大4セグメントので資産を処理すると、私はいつも持っている資産に対してそのコードに追加することができますif文70行を書かれている

<?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> 

:ここ

は、4つのセグメントを持っている例のXMLです

:理想的には

<number_of_segments>4</number_of_segments> 

は、それがのx量が生成されます。私は、動的にXMLでこの要素に基づいてセグメントのリストを作成する機能に取り組んでいますので、複数のセグメントは、しかし、それは非常にエレガントではありません

parse_xml()関数は、アセットのセグメント数に基づいています。ここで

は関数です:seg_elementの各反復(によって作成されたリストの名前の

['seg_1_dur = 00:01:00.000'] 
['seg_1_in = 00:00:00.000'] 
['seg_1_out = 00:01:00.000'] 

)異なる次のようになります。

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) 

ここで出力されています。

FFMPEGに提出するためのコマンドを作成するには、このようにする理由は、ここにコマンドをhttp://pastebin.com/jgawC48Y

+0

私はそれを得ることはありません。あなたの例から無関係のジャンクをカットしてください。あなたが言及している70行の 'if'チェーンの一部を見せてください。 –

+0

なぜ私は最終結果が欲しいのですか?あなたはそのプリントでうまくやっているようです。 –

+0

詳細は編集を参照してください。 – Lewis909

答えて

4

を作成するif文70行がある関数を生成する必要はありません、あなただけをループをしたいですセグメントの数、それに応じてseg_element関数を呼び出す:

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 

(上記のコードは、テストされていませんが、私はあなたがそれを得ると思います)

+0

助けてくれてありがとう、私はそれをテストしたときに働いた4すべての正しいデータを含むリストが作成されました。 – Lewis909

関連する問題