请问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大神指导 展开
[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大神指导 展开
2个回答
展开全部
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
展开全部
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也不会用,就按默认的编码来
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询