消除或简化重复的 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])
我在 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])