2016-11-18 2 views
-1

함수를 동적으로 생성 할 수 있습니까?파이썬 - 함수를 동적으로 스폰 할 수 있습니까?

이 example.xml 파일을 구문 분석하고 list_1 요소의 특성을 목록으로 반환하는 함수를 작성했습니다. 이제이 예제에는 4 개의 세그먼트가 포함되어 있습니다. 그러나이 세그먼트는 서로 다른 자산에 대해 변경되며 하나는 세그먼트 만 가질 수 있고 다른 세그먼트는 10+를 가질 수 있습니다. 최대 4 개의 세그먼트의와 자산을 처리 할 문이와 나는 항상이 자산에 대해 그 코드에 추가 할 수 있다면 나는 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에서이 요소를 기반으로 세그먼트 목록을 생성하는 기능을하고 있어요, 그래서 더 세그먼트는, 그러나 그것은 매우 우아하지 않습니다

return seg_element(root, path) 

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_element의 각 반복 (의해 생성 된리스트의 이름
['seg_1_dur = 00:01:00.000'] 
['seg_1_in = 00:00:00.000'] 
['seg_1_out = 00:01:00.000'] 

)가 다른 것이다. 기능을 생성 할 필요가 없습니다 명령 http://pastebin.com/jgawC48Y

+0

난 이해가 안돼 : 세그먼트의 수, 그에 따라 seg_element 함수를 호출합니다. 너의보기에서 관계없는 쓰레기를 자른다. 그리고 당신이 언급 한 70 줄'if' 체인의 일부를 보여줍니다. –

+0

원하는 최종 결과가 왜 필요한지 물어보아야합니까? 그 인쇄물로 잘하고있는 것 같아. –

+0

자세한 내용은 편집을 참조하십시오. – Lewis909

답변

4

을 생성 문, 당신은 그냥 루프를 수행하려는 경우

는 , 여기에 70 라인을 FFMPEG에 제출하는 명령을 작성하려면이 작업을 수행하는 이유

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

관련 문제