如何基于数据框列的唯一值创建文本文件?

时间:2020-06-24 01:42:15

标签: python excel pandas export concatenation

我有一个带有2列('NE'和'Interface')的excel表,我想要做的是:使用以下命令编辑.txt文件模板(我已经有了,在下面显示)每个接口值。然后串联属于同一组“ NE”的txt文件。

这是我的优势:

excel

这是我的txt文件模板,我想使用excel的界面值更改“接口”:

conf t
**$interface**   
no service-policy input QOS-IN_ACCESS
end
conf t
no policy-map QOS-IN_ACCESS 
policy-map QOS-IN_ACCESS 
class DSCP_VOIX_SIG 
set mpls experimental imposition 5 
set qos-group 5 
end
conf t
**$interface**   
service-policy input QOS-IN_ACCESS
end

这是我的代码:(我已经连接了文件,我需要做的是将它们放在一组NE中)

from string import Template
import pandas as pd

df3 = pd.read_excel(r"C:\Users\audit_policymap.xlsx")
with open(r"C:\Users\audit_policymap.txt") as fp:
    template = Template(fp.read())

content2 = ''
content3 = ''
for i in range(len(df3)):
    file_name = df.loc[i, "NE"] + '_output.txt'
    with open(file_name, 'w') as fp:
        content = template.substitute(interface=df.loc[i, "Interface"]) 
        if  df.loc[i, "NE"] == df.loc[i+1, "NE"]:
            content2 = str(content2)+'\n'+str(content)+'\n'
            content3 = str(content2)+'\n'
            fp.write(content2)
        else:  
            content2 = ''
            content3 = str(content3)+'\n'+str(content)+'\n'
            fp.write(content3)

总结:我想针对每个“ NE”编辑一个txt文件,并根据其对应的“ NE”对所有界面进行编辑

1 个答案:

答案 0 :(得分:0)

  • NE列上使用pandas.DataFrame.groupby
    • 这将返回一个DataFrameGroupBy对象,其中iNE中唯一的groupby值,而g是关联的组。
    • for循环将遍历NE中的每个唯一值
  • 使用f字符串指定唯一的文件名(例如f'{i}_output.txt'
    • '250002-PEFTTS-2_output.txt'
  • 由于g中的所有值仅属于NE中唯一的值之一,因此无需检查NE是否与每行匹配,就像您在问题。
  • [str(template.substitute(interface=row)) for row in g.Interface]是一个列表理解,对于g.Interface中的每一行,将str(template.substitute(interface=row))添加到列表中。
    • '\n'.join()将列表中的每个项目连接为一个由换行符分隔的字符串。
for i, g in df.groupby('NE'):  # iterate through unique values in NE
    file_name = f'{i}_output.txt'  # create the empty content string
    with open(file_name, 'w') as fp:  # open the file
        content = '\n'.join([str(template.substitute(interface=row)) for row in g.Interface])
        fp.write(content)  # write content to file