很多时候我们拿到的文本文件都是格式不规范的,甚至是相当不规范的。。所以我们想要把不规范的文本文件变成规范的表格式,便于后续的模型训练和分析,在本篇文章中,主要的难点是从文本文件提取key-value的工作。

Step-0:数据示例

比如我们需要把如下数据中的key和value分别提取出来,并将相同key的值放在一列:qid=157238221 isAdopted=1 qTags= qTime=2010-06-03 19:47 giveScore=200 askerid=188349317 askerGrade=5 askerGoodRate=48 askerAnswerNumber=44 askerName=cribberbdaid=467956656 isBest=1 ahasComment=0 aTime=2010-06-04 16:54 aCon=参看:a href="http:baike.baidu.comview1678662.htm?fr=ala0_1_1" target="_blank"http:baike.baidu.comview1678662.htm?fr=ala0_1_1a answerid=169837710 answerName= answerCareField= answerGrade= answerGoodRate= answerNum= answerIsMaster= answerIsFamous=aid=467569408 isBest= ahasComment=0 aTime=2010-06-03 20:09 aCon= will always love you下载地址a href="http:mp3.baidu.comm?f=ms&rn=&tn=baidump3&ct=134217728&word=I+will+always+love+you&lm=-1" target="_blank"http:mp3.baidu.comm?f=ms&rn=&tn=baidump3&ct=134217728&word=I+will+always+love+you&lm=-1a answerid=129235439 answerName=唯念潇湘 answerCareField= answerGrade=5 answerGoodRate=40 answerNum=46 answerIsMaster=0 answerIsFamous=0aid=467584335 isBest= ahasComment=0 aTime=2010-06-03 20:35 aCon=是i will always love you= = answerid=12422236 answerName=qizi86 answerCareField=电视" answerGrade=18 answerGoodRate=36 answerNum=13266 answerIsMaster=0 answerIsFamous=0aid=467849272 isBest= ahasComment=0 aTime=2010-06-04 13:17 aCon=长风镖局》 answerid=194560318 answerName=水滴里的火花 answerCareField= answerGrade=2 answerGoodRate=19 answerNum=5 answerIsMaster=0 answerIsFamous=0aid=470025197 isBest= ahasComment=0 aTime=2010-06-08 17:27 aCon=长风镖局》 answerid=192636431 answerName=346317740 answerCareField=校园生活 answerGrade=5 answerGoodRate=14 answerNum=17 answerIsMaster=0 answerIsFamous=0

Step-1:数据载入:

没什么可说的,直接with open,需要注意的是原始文档当中有特殊字符,因此需要加上忽略错误with open(filename,encoding='utf-8',errors='ignore') as f:

另外由于原始文件特别大,为了避免内存直接爆掉,采用了循环逐行读取的f.readline()。

Step-2:格式化:

进入重头戏格式化,分析数据发现不同的keyvalue对是用空格分割的,但是许多内容中本身就有空格。。。坑爹啊这不是。。。看来直接用空格分割不靠谱。。。

后来尝试了分割成list,用list组成dataframe,不过分完才发现,每条记录的key个数并不相同,所以这样做也会出问题。

最后发现key、value之间是用=号分割的,因此采用正则来提取pattern,但是提取出来才发现,许多文本中也含有“=”这个特殊字符,做到这我已经想不出别的招来了= =,所以决定给“=”前后正则加上限制,只有大小写英文小写开头小写结束(分析不完整的参数key字典发现的规则)的才勉强算是正常的key,后面通过key传非空的比例来决定key的取舍,异常的key的值空率放在大样本上应该是接近百分百的。。

最后话不多说,放代码吧:

def load_data(filename,n):

with open(filename,encoding='utf-8',errors='ignore') as f:

#f=open('QACorpusData',encoding='utf-8',errors='ignore')

#确定正则匹配模式

pattern= re.compile(r'[a-z]{1,}[a-zA-Z]{1,}[a-z]{1,}=[^=]{0,} |[a-z]{1,}[a-zA-Z]{1,}[a-z]{1,}=[^=]{0,}')

#循环文件中每一行

kv_data_Q=[]

kv_data_A=[]

#for each_line in f:

for k in range(0,n):

#将Question和Answer分开分别建表

each_line= f.readline()

line=each_line.strip().split('\t')

for i in range(0,len(line)):

ss=pattern.findall(line[i])

#print(ss)

#print(len(ss))

data=[]

#取出key-value并分割

for i in ss:

tmp=i.strip().split('=')

data.append(tmp)

#转换为dict类型

data_dict=dict(data)

#增加Q&A分类

if 'qid' in data_dict.keys():

#data_dict['type']='Q'

qid=data_dict['qid']

#append到Qusetion表

kv_data_Q.append(data_dict)

else:

data_dict['qid']=qid

#data_dict['type']='A'

kv_data_A.append(data_dict)

#append到Answer表

df_Q=pd.DataFrame.from_dict(kv_data_Q)

df_A=pd.DataFrame.from_dict(kv_data_A)

return df_Q,df_A

#f.close()

Step-3:去除误识别:

通过列的空值比例去除误识别,代码如下:

#考察各列的空值个数

def empty_count(df):

n=len(df)#数据集记录数

empty_cnt = pd.DataFrame(columns=['columns_name', 'normal', 'null','empty'])

for c in df.columns:

n_cnt=sum(df[c].isnull())#判断是否为NaN

e_cnt=sum(df[c].apply(lambda x: True if x ==''  else False))#判断是否为空字符

empty_cnt=empty_cnt.append({'columns_name':c,'normal':(n-n_cnt-e_cnt)/n,'null':n_cnt/n,'empty':e_cnt/n},ignore_index=True)

return empty_cnt

#print(empty_cnt)

#删除异常的列

def del_cols(df):

df_ec=empty_count(df)

for col in df_ec[df_ec.null>=0.9].columns_name:

df.drop(col,axis=1,inplace=True)

for df_deal in [df_Q_Cheat,df_A_Cheat,df_Q_Normal,df_A_Normal]:

del_cols(df_deal)

print(df_deal,'check!')

空值判断效果

python txt转dataframe_Python格式化解析不规则txt文本并转为dataframe相关推荐

  1. python实现解析oui.txt并抽取MAC前缀及组织名称

    做无线抓包时就曾经设想过显示MAC地址所属组织的名称,一直在研究如何根据MAC查询对应的名称.今天无意看到网上有相关文章,里面有介绍,使用C语言实现.本文使用python来实现. oui.txt文件可 ...

  2. python读取txt为dataframe_python批量读取txt文件为DataFrame的方法

    我们有时候会批量处理同一个文件夹下的文件,并且希望读取到一个文件里面便于我们计算操作.比方我有下图一系列的txt文件,我该如何把它们写入一个txt文件中并且读取为DataFrame格式呢? 首先我们要 ...

  3. python txt文件 报文分析_Python读写txt文本文件的操作方法全解析

    一.文件的打开和创建 >>> f = open('/tmp/test.txt') >>> f.read() 'hello python!\nhello world! ...

  4. python读取txt为dataframe_python批量读取txt文件为DataFrame格式的方法总结

    python怎么批量读取txt文件为DataFrame格式 这次给大家带来python怎么批量读取txt文件为DataFrame格式,python批量读取txt文件为DataFrame格式的注意事项有 ...

  5. Python 学习笔记(3)对txt文件的读与写操作(下)

    上一章节我们讨论了如何对txt文本文件进行读写操作,这一张将讨论如何进行二进制文件的写与读.<Python 学习笔记(3)对txt文件的读与写操作(上)>的链接如下https://blog ...

  6. 【Python】06 - 常用文件处理(txt、excel [xlsx、xls])

    目录 一.文件概述 二.文本文件操作 2.1 文件打开 2.2 文件的关闭 2.3 文件的读.写操作 1) 读取方法 2)写入方法 2.4 读写指针的重定位 2.5 其它文本文件 三.Excel文件处 ...

  7. python如何读取txt文件-如何在python中读取文件夹中的txt文件列表

    注意:我在答案的最后写了这些函数,所以请随意跳转到那个 – 但是为了更好地理解,我仍然希望逐个部分地运行代码. 将用于解释的示例方案 假设您在此文件夹中有12个名为test的文件,其中10个是.txt ...

  8. Python 学习笔记(3)对txt文件的读与写操作(上)

    目录 1.file 对象 2.open() 方法 3.txt文件的读与写 3.1.写txt文件 3.2.读txt文件 3.2.在文件末尾续写文件 4.写在最后 1.file 对象 file 对象使用 ...

  9. python批量新建文件夹_python根据txt文本批量创建文件夹

    前言 前言:想写这个代码的原因是因为实习的时候需要根据表格名创建对应的文件夹,如果只是很少个数文件夹的话,ctrl+shift+n还可以接受吧,可是一次就要创建几百个文件夹,这就有点方方了.所以我写了 ...

最新文章

  1. 轻松学Pytorch – 行人检测Mask-RCNN模型训练与使用
  2. redis c客户端 hiredis
  3. [watevrCTF-2019]Pickle Store
  4. learn-the-architecture系列
  5. 软件开发的“黑名单”规则设定:benchmark
  6. Vue中如何正常使用锚点定位?
  7. MySQL创建新连接时,不能成功连接的问题
  8. vscode 日志文件_vscode 日志文件_Visual Studio Code(VS code)介绍
  9. linux环境下 Redis 配置文件
  10. 使用 RetroShare 分享资源
  11. LNK1123转换到COFF期间失败
  12. 【超详细教程(附源码)】基于 ARM Cortex-M3 处理器与 FPGA 的实时人脸检测 SOC
  13. linux设备模型详解
  14. PCB线路板塞孔工艺的那些事儿~
  15. 计院生活--第一章 卧薪尝胆
  16. 求一个数除 1 和自身以外的因子
  17. 什么是概念模型?概念模型的作用是什么?
  18. mysql show tables报错_show tables能看到表却无法读写?
  19. 读《读大学,究竟读什么》感悟一
  20. 华为机试真题 Python 实现【无向图染色】【2022.11 Q4新题】

热门文章

  1. python tkinter 中文文档_Python实现中文文档的简体与繁体互相转换
  2. python中的type函数-python的type函数
  3. fedora 20 中关闭防火墙
  4. c++ linux 获取毫秒_Linux下gettimeofday()函数和clock()函数:精确到毫秒级的时间
  5. linux如何看分配固定共享内存段,Linux共享内存的查看和删除
  6. 使用计算机六年级,二十年后的电子计算机六年级作文
  7. webwork在freemarker中使用iterator
  8. Mybatis plus 整合springboot 出现的Invalid bound statement (not found)问题
  9. java匿名内部对象_JavaSE 学习参考:匿名内部类和匿名对象
  10. postman启动没反应_电脑主机开机但显示器没反应?检查这4个地方,2分钟内找出问题...