消除或简化重复的 Python 代码

Eliminate or Simplify repetitive Python code

我在 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_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个打印,还好,因为是客户想要的,但是我要简化或者去掉重复的代码,加载其他的xml类型的文件:link to long xml,并且可以读取,不只是example1.xml:

我用下面的代码做了测试,但是在所有情况下,打印结果都是单独给我的:

    signals_name = signals_df["Name"]
    # print(signals_name)
    row_signals_name = signals_name.T
    # print(row_signals_name)
    for i in row_signals_name:
        print(i)

我一直在检查 Pandas 是否将 DataFrame 保存为多个维度的数组,在我的例子中它只是二维的,但我找不到如何检查该数组让我得到类型变量中的名称:

    names_list = ['Status', 'SetDSP', 'HMI', 'Delay', 'DSP']

但不是获取硬编码名称,而是将它们功能化或简化为 Python 代码中的变量(或删除此函数的重复性),以便当客户想要使用另一个 XML 文件具有相同的结构,但代码中没有硬编码的其他名称,extract_name_value (signals_df) 函数可以毫无问题地读取它们。预先非常感谢。

您可以将重复部分提取到它自己的函数中,该函数将更改的部分作为参数,例如:

def get_vector(data,name):
    step1  = data[data.Name.isin([name])]
    step2  = step1.T
    result = step2.iloc[[1]]
    return result

从而减少 extract_name_value 对该函数的多次调用

def extract_name_value(signals_df):
    print('1: ', get_vector(signals_df, "Status"))
    print('2: ', get_vector(signals_df, "SetDSP"))
    ...

然后您可以通过将您感兴趣的字段列表作为参数来进一步概括,例如:

def extract_name_value(signals_df, fields):
    for n, name in enumerate(fields, 1):
        print(f'{n}: ', get_vector(signals_df, name))

并将该函数称为 extract_name_value(signals_df,['Status', 'SetDSP', 'HMI', 'Delay', etc])