首页 > 解决方案 > 如何在 for 循环或其他中简化 python 代码

问题描述

我正在使用 Python 中的 ElementTree 和 Pandas 模块进行以下开发:

    import xml.etree.ElementTree as ET
    import pandas as pd
    
    file_xml = ET.parse('example1.xml')
    rootXML = file_xml.getroot()
    
    def transfor_data_atri(rootXML):
        file_xml = ET.parse(rootXML)
        data_XML = [
            {"Name": signal.attrib["Name"],
             # "Value": signal.attrib["Value"]
             "Value": int(signal.attrib["Value"].split(' ')[0])
             } for signal in file_xml.findall(".//Signal")
        ]
        
        signals_df = pd.DataFrame(data_XML)
        extract_name_value(signals_df)
        
    def extract_name_value(signals_df):
        #print(signals_df)
        
        signal_ig_st = signals_df[signals_df.Name.isin(["Status"])]
        row_values_ig_st = signal_ig_st.T
        vector_ig_st = row_values_ig_st.iloc[[1]]
        
        signal_nav_DSP_rq = signals_df[signals_df.Name.isin(["SetDSP"])]
        row_values_nav_DSP_rq = signal_nav_DSP_rq.T
        vector_nav_DSP_rq = row_values_nav_DSP_rq.iloc[[1]]
        
        signal_HMI_st = signals_df[signals_df.Name.isin(["HMI"])]
        row_values_HMI_st = signal_HMI_st.T
        vector_HMI_st = row_values_HMI_st.iloc[[1]]
        
        signal_delay_ac = signals_df[signals_df.Name.isin(["Delay"])]
        row_values_delay_ac = signal_delay_ac.T
        vector_delay_ac = row_values_delay_ac.iloc[[1]]
        
        signal_AutoConfigO_Rear = signals_df[signals_df.Name.isin(["AutoConfigO_Rear"])]
        row_values_AutoConfigO_Rear = signal_AutoConfigO_Rear.T
        vector_AutoConfigO_Rear = row_values_AutoConfigO_Rear.iloc[[1]]
        
        signal_ACO_Front = signals_df[signals_df.Name.isin(["AutoConfigO_Front"])]
        row_values_ACO_Front = signal_ACO_Front.T
        vertor_ACO_Front = row_values_ACO_Front.iloc[[1]]
        
        signal_ACO_Drvr = signals_df[signals_df.Name.isin(["AutoConfigO_Drvr"])]
        row_values_ACO_Drvr = signal_ACO_Drvr.T
        vector_ACO_Drvr = row_values_ACO_Drvr.iloc[[1]]
        
        signal_ACO_Allst = signals_df[signals_df.Name.isin(["AutoConfigO_Allst"])]
        row_values_ACO_Allst = signal_ACO_Allst.T
        vector_ACO_Allst = row_values_ACO_Allst.iloc[[1]]
        
        signal_RURRq_st = signals_df[signals_df.Name.isin(["RUResReqstStat"])]
        row_values_RURRq_st = signal_RURRq_st.T
        vector_RURRq_st = row_values_RURRq_st.iloc[[1]]
        
        signal_RURqSy_st = signals_df[signals_df.Name.isin(["RUReqstrSystem"])]
        row_values_RURqSy_st = signal_RURqSy_st.T
        vector_RURqSy_st = row_values_RURqSy_st.iloc[[1]]
        
        signal_RUAudS_st = signals_df[signals_df.Name.isin(["RUSource"])]
        row_values_RUAudS_st = signal_RUAudS_st.T
        vector_RUAudS_st = row_values_RUAudS_st.iloc[[1]]
        
        signal_DSP_st = signals_df[signals_df.Name.isin(["DSP"])]
        row_values_DSP = signal_DSP.T
        vector_DSP = row_values_DSP.iloc[[1]]
        
        print('1: ', vector_ig_st)
        print('2: ', vector_nav_DSP_rq)
        print('3: ', vector_HMI_st)
        print('4: ', vector_delay_ac)
        

上面的输出如下,它们是前 4 次打印,这很好,因为这是他们想要的,但我必须简化代码,以便任何类型为example.xml的 xml 文件都可以不仅要阅读 example1.xml:

在此处输入图像描述

简化代码需要将数据原样带入 names_list 变量中,但不能使用这个变量,它实际上是硬编码的:

        names_list = [
            'Status', 'SetDSP', 'HMI', 'Delay', 'AutoConfigO_Rear',
            'AutoConfigO_Front', 'AutoConfigO_Drvr','AutoConfigO_Allst',
            'RUResReqstStat', 'RUReqstrSystem', 'RUSource', 'DSP' 
            ]

因此,当客户端想要放置另一个具有相同结构但具有代码中没有的名称的 XML 文件时,它可以毫无问题地读取它们。预先非常感谢您。

标签: pythonfor-loopelementtree

解决方案


我希望我能正确理解这些问题。我的理解是

  1. 您希望动态生成该extract_name_value()函数,并使其在代码中不那么庞大。

  2. 对不起,但我没能理解for i in signal_name: print(i)问题的一部分。也许您可以改写这个问题,并帮助我理解?

我对该extract_name_value()部分的解决方案是使用该exec()功能。它是用于动态执行的内置解决方案。



name_list = ['Status', 'SetDSP', 'HMI', 'Delay', 'AutoConfigO_Rear',
            'AutoConfigO_Front', 'AutoConfigO_Drvr', 'AutoConfigO_Allst',
            'RUResReqstStat', 'RUReqstrSystem', 'RUSource', 'DSP']

def _build_extract_name_value_func(name_list):
  extract_name_value_func = ""
  for name in name_list:
    holder_func = f"""
        signal_{name} = signals_df[signals_df.Name.isin([{name}])]
        row_values_{name} = signal_{name}.T
        vector_{name} = row_values_{name}.iloc[[1]]
        vector_list.append(vector_{name})
        """
    extract_name_value_func += holder_func
  return extract_name_value_func

def extract_name_value(name_list):
  extract_name_value_func = build_extract_name_value_func(name_list)
  exec(extract_name_value_func)

该代码未使用实际数据进行测试,因为我不熟悉处理 xml 结构。但我希望python部分可以对你有所帮助。


推荐阅读