请问python如何按照属性分类

比如有一个txt文件,里面内容如下:[fn][1234][parid=b1234][1234][fn][fn][1234][dfd][parid=b234][1234]d... 比如有一个txt文件,里面内容如下:
[fn][1234][parid=b1234][1234][fn]
[fn][1234][dfd][parid=b234][1234]dfkj[1234][dfdf][ew][ew][cx][cxv][1234]
xmldfkjfdjkljfdkfjdfdfdf[prreedfdfdfdfdf][fn]
[fn][1234][parid=b3456][1234][fn]
[fn][1234][dfdfd]dfsfsd[parid=b1234][trgf][fn]
[fn][454]dfdfdfd[parid=b3456][dfsdfsdfddddddddddddddddddddd]
[45][dfdfdfdfd][fn]
要怎样把上面的每一个parid相同的[fn]放一txt文件里,就是根据id分类放,比如parid=b1234的[fn]放到一个b1234.txt,parid=b3456的[fn]放到一个b3456.txt里,求python大神指导
展开
 我来答
tim_spac
2013-12-03 · TA获得超过3628个赞
知道大有可为答主
回答量:1804
采纳率:100%
帮助的人:2019万
展开全部

step 1: 解析行, 得到行中的parid

step 2: 建立以parid为key的字典采集行

step 3: 按字典的key输出文件

#!/usr/bin/python
# coding: utf-8
#
# date: Dec., 2013

import re

patt = re.compile(r".*\[parid=(?P<parid>[^\]]*)\].*")

def fileparser(filename):
    buff = []
    with open(filename) as handle:
        for ln in handle:
            if ln.startswith('[fn]') or not buff:
                buff.append(ln)
            else:
                buff[-1] += ln
    return buff


collector = {}
for ln in fileparser('fn_test.txt'):
    collector.setdefault(patt.match(ln).groupdict().get("parid"), []).append(ln)

# storage to text file
for parid, lns in collector.items():
    with open("%s.txt" % parid, 'wt') as handle:
        handle.writelines(lns)
追问
你好,我试了上方代码,功能更为强大,分类了几种后就报UnicodeEncodeError: 'gbk' codec can't encode character '\ufffd' in position 358: illegal multibyte sequence,能留个什么联系方式么,好把我的文件给你看看,十分感谢
追答

这个现象应该是数据文件中包含了中文字符,建议用统一的编解码形态读写文件

#!/usr/bin/python
# coding: utf-8
#
# date: Dec., 2013
 
import re
import codecs
 
patt = re.compile(r".*\[parid=(?P<parid>[^\]]*)\].*")
 
def fileparser(filename):
    buff = []
    with codecs.open(filename, 'r', 'gbk') as handle:
        for ln in handle:
            if ln.startswith('[fn]') or not buff:
                buff.append(ln)
            else:
                buff[-1] += ln
    return buff
 
 
collector = {}
for ln in fileparser('fn_test.txt'):
    collector.setdefault(patt.match(ln).groupdict().get("parid"), []).append(ln)
 
# storage to text file
for parid, lns in collector.items():
    with codecs.open("%s.txt" % parid, 'w', 'gbk') as handle:
        handle.writelines(lns)

 

交流邮箱: tim_spac@126.com

albumin
2013-12-02 · TA获得超过1.2万个赞
知道大有可为答主
回答量:4889
采纳率:87%
帮助的人:2389万
展开全部
import re
fnfile=open(r"test.txt","r")
text=fnfile.read()
groupby=set(re.findall(r"(?<=\[parid=)[^\]]+(?=\])",text))
for element in groupby:
    tmpfile=open(element+".txt",'w')
    pattern=r".*\[parid="+re.escape(element)+r"\].*\r?\n"
    tmpfile.writelines(re.findall(pattern,text))
    tmpfile.close()
fnfile.close()

以上代码假设原始文本文件名称为test.txt,然后根据parid分别放入相应的txt文件

追问
感谢你给我的帮助,前面open时改了下加了encoding='utf-8',但是分类得差不多时就报'gbk' codec can't encode character '\ufffd',里面有点特殊情况parid有的时候可能为空,能默认一个名字么?,还有就是一条数据可能是三行五行或者更多 ,这样只判断了只能把有parid的一行放入文件,不能把整个[fn]的内容放进去,感觉有点特殊,大神能解决么
追答
import re
import codecs
fnfile=open(r"test.txt","r")
text=fnfile.read()
groupby=set(re.findall(r"(?u)(?<=\[parid=)[^\]]*(?=\])",text))
for element in groupby:
    if not element:
        tmpfile=open("defparid.txt",'w');
    else:
        tmpfile=open(element+".txt",'w')
    pattern="(?u)\\[fn\\][^\r\n]*\\[parid="+re.escape(element)+\
    "\\](?s).*?\\[fn\\]\s*"
    for match in re.finditer(pattern,text):
        tmpfile.write(match.group(0))
    tmpfile.close()
fnfile.close()

对python3不熟,不知道str怎么转换编码,byte也不会用,就按默认的编码来

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式