簡體   English   中英

如何在 for 循環或其他中簡化 python 代碼

[英]How to simplify python code in for loop or another

我正在使用 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)
        

The output of the above is the following, they are the first 4 prints and it is fine, because it is what they want, but I have to simplify the code , so that any type of xml file of the type example.xml , can不僅要閱讀 example1.xml:

在此處輸入圖像描述

簡化代碼需要將數據原樣帶入 names_list 變量,但不能使用這個變量,它實際上是硬編碼的:

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

所以當客戶想再放一個XML文件,結構相同,但有其他代碼中沒有的名字時,它可以毫無問題地讀取它們。 預先非常感謝您。

我希望我能正確理解這些問題。 我的理解是

  1. 您想動態生成extract_name_value() function,並使其在代碼中不那么龐大。

  2. 對不起,但我無法理解for i in signal_name: print(i)問題的一部分。 也許您可以改寫這個問題,並幫助我理解?

我對extract_name_value()部分的解決方案是使用exec() function。 它是用於動態執行的內置解決方案。



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 部分可以對您有所幫助。

我能夠解決它,我使用了一個 for 循環並迭代了 dataframe 本身:

    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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM