操纵django-export-import的输出

时间:2016-01-23 14:52:20

标签: python django

我有一个django应用程序,它使用类将django-export-import的输出写入静态文件夹。

我想删除输出的第一行和逗号之后的任何内容。

我试过使用re,但我似乎无法让它工作。

这是当前的输出:

ipadd,active 192.168.42.33/32,1 192.168.95.1/32,1

我希望输出为:

192.168.42.33/32 192.168.95.1/32

这是我的代码

class IPResourceExport(resources.ModelResource):

class Meta:
    model = IPAddress
    fields = ('ipadd', 'active',)

def deploy_ip(request):

    queryset = IPAddress.objects.filter(active=1)
    dataset = IPResourceExport().export(queryset)

    output_path = settings.STATIC_ROOT + '/iptemp.txt'

    f = open(output_path, 'w')
    f.write(dataset.csv)
    f.flush()
    f.close()
    template_name = "block/deploy.html"
    context = {}
    return render(request, template_name, context)

更新了工作代码:

def deploy_ip(request):

    queryset = IPAddress.objects.filter(active=1)
    dataset = IPResourceExport().export(queryset)

    new_data = dataset.csv
    out_data = re.sub(',1', '', new_data.split('\n', 1)[1])

    output_path = settings.STATIC_ROOT + '/output/iptemp.txt'

    f = open(output_path, 'w')
    f.write(out_data)
    f.close()
    template_name = "block/deploy.html"
    context = {}
    return render(request, template_name, context)

2 个答案:

答案 0 :(得分:0)

我添加了正则表达式并拆分为函数以获得我需要的输出。上面更新的工作代码中的代码按预期工作。谢谢杰布!

>> import re
>>> original = "ipadd,active\n192.168.42.33/32,1\n192.168.95.1/32"
>>> print original
ipadd,active
192.168.42.33/32,1
192.168.95.1/32,1
>>> print original.split('\n', 1)
['ipadd,active', '192.168.42.33/32,1\n192.168.95.1/32']
>>> print original.split('\n', 1)[1]
192.168.42.33/32,1
192.168.95.1/32,1
other stuff
>>> print re.sub(',1', '', original.split('\n', 1)[1])
192.168.42.33/32
192.168.95.1/32
>>>

答案 1 :(得分:0)

我认为最好在字符串对象dataset写入文件之前对其进行操作。

所以我们可以从字符串

开始
>>> original = "ipadd,active\n192.168.42.33/32,1\n192.168.95.1/32,1\nother stuff"
>>> print original
ipadd,active
192.168.42.33/32,1
192.168.95.1/32,1

然后使用字符串方法split在发生'\n'的地方划分字符串,并返回包含所有部分的列表。由于我们只想将其分为两部分,因此我们会将maxsplit参数设置为1 docs on str.split

>>> print original.split('\n', 1)
['ipadd,active', '192.168.42.33/32,1\n192.168.95.1/32,1\nother stuff']

然后我们可以只使用列表的第二部分(索引1)作为新的字符串dataset并删除第一行

>>> print original.split('\n', 1)[1]
192.168.42.33/32,1
192.168.95.1/32,1
other stuff

现在,为了获得',1',我们可以使用re模块和sub函数执行类似sed搜索和替换的操作。我们正在搜索',1'的所有实例,并在目标字符串''中将其替换为original.blah.blah,即无内容。 docs on re.sub

>> import re
>>> print re.sub(',1', '', original.split('\n', 1)[1])
192.168.42.33/32
192.168.95.1/32
other stuff