【问题标题】:Eliminate or Simplify repetitive Python code消除或简化重复的 Python 代码
【发布时间】:2021-06-13 21:41:28
【问题描述】:

我正在使用 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文件type: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) 函数可以毫无问题地读取它们。预先非常感谢您。

【问题讨论】:

    标签: python pandas for-loop elementtree


    【解决方案1】:

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

    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])

    【讨论】:

    • 完美的@Copperfield 它为我工作如下:for i in signals_df.Name: signal = signals_df [signals_df.Name.isin ([i])] row_values = signal.T vector = row_values.iloc [[1]] print (vector)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    相关资源
    最近更新 更多