闲来无事,开始总结自己最近学过做过的东西。想想,数据才是所有网络和编程的核心,包括人工智能。但是自己的数据处理能力,仅仅停留在excel基础,只用代码完成过64个表格的批量筛选和提取。
后来阅读和搜索发现,Python里面处理数据,pandas和numpy才是王道。所以最近开始想办法学习这两个东西。
怎么学?看代码,看书,太枯燥。买课又不想花钱。经过研究发现,pandas是可以处理类似excel结构的各种数据的。包括最近我研究的sqlit3。上一篇博客刚研究过一点,附文章链接如下:https://blog.csdn.net/hq606/article/details/105545719
pandas在保存爬虫数据到excel时候用过几次。所以、我的思路是,趁着有感觉,把做过的excel提取数据的代码,全部替换为pandas。这样就感觉目标很强烈,好奇心膨胀,一刻不耽误,看看我十几天写的代码,用pandas能不能很快替换出来,而且代码量尽量少,那样就会很有意思,越想越兴奋。没想到一上午就达到原来的效果啦。验证了pandas确实提取和处理数据是很好用的。比起excel相关的库,好用多了。
pandas侧重于提取,清洗,分析。excel相关的库,侧重于写入,格式修改。
接下来放上代码,便于以后复习查看。写的比较乱,完全是堆砌的,一边百度一边堆砌上去。
有缘看到我的文章的话,欢迎各种吐槽,狠狠地批评,指出问题,让我继续学习提高。
import pandas as pd
import numpy as np
import 正则条件 #自己写的匹配函数用的正则,做了一个小函数
from openpyxl import load_workbook,Workbook
import is_contain_chinese #这个是判断数据是否包含汉字
def read_excel1(path):#函数 提取所有sheet名字
data_xls = pd.ExcelFile(path)
#print(data_xls.sheet_names)
#print(name)
return data_xls.sheet_names
def pddata(path,k):#主函数 path文件路径 K是sheet名的序号 读取表格筛选数据
global xx,rows,dfdata,out
read_excel1(path)
rows=pd.read_excel(path, sheet_name=read_excel1(path)[k])
labels = list(rows.columns.values) #为了得到表格的表头名称,df不会输出这个东西
#print(rows)
aa=pd.DataFrame(rows)
dfdata=[]
x=np.array(rows.loc[:])#这里是把读取的全部 数据转为array 便于遍历
xx=pd.DataFrame(x)#转成一个df对象,万一用的着,里面有个次标题要用它提取
y=x.tolist()#把array转为列表的方法记录一下用法而已,不是重点
n=0 #用来记录遍历到哪一行
for i in np.array(rows.loc[:]):#开始遍历
n+=1
for j in i:
aa,bb=正则条件.stloc(str(j))
if 3196 <= int(aa) <= 9060 or 3196 <= int(bb) <= 9060:
dfdata.append(i)
print(n)
#xx.drop(labels=[m],axis=0,inplace=True) #删除行的方法,仅仅记录一下方法
#bb=pd.DataFrame(dfdata)
print('*****************************************************')
#print(pd.DataFrame([rows.columns.values]))
#print(xx[:2])
#print(pd.DataFrame(dfdata))
title0=pd.DataFrame([rows.columns.values]) #表头文字名称
title1=xx[:2] #次级表头名称
content=pd.DataFrame(dfdata) #表格里面提取到的数据内容
out=pd.concat([title0,title1,content])#这个有用,把三个df对象拼接起来,便于一次性写入excel
print(read_excel1(path)[k]) #显示本次循环的sheet名
print(out)
return out# 把拼接好的df对象返回给函数
if __name__ == '__main__':
path='汇总.xlsx'# 需要提取的文件
read_excel1(path) #读取文件得到sheetnames
wb =Workbook()
wb.save('output.xlsx')#生成一个文件作为要输出的文件
for k in range(len(read_excel1(path))):#开始遍历每一个sheet 正则匹配提取数据
#for k in range(1): #这一句是测试用的,只读取第一个sheet 试试效果
writer=pd.ExcelWriter('output.xlsx', engine='openpyxl') #用openpyxl是为了避免循环的时候sheet写入总是被覆盖的问题,单次不会覆盖,循环就会出现,不明白原因,反正这样可以写入,不会被覆盖。
book = load_workbook('output.xlsx')
writer.book = book
data3 = pddata(path,k) #这个是重点筛选数据的主要函数方法**
data3.to_excel(writer,sheet_name=read_excel1(path)[k],index=False) #把out传入excel保存
writer.save()
数据和图片就不放了,不能泄露数据啊。
就是64个工作表,需要提取符合条件的数据,整行取出来。
附上我的正则条件函数,完全是猜的
def stloc(ss):
try:
m2= re.findall('(?:K)\d+[+]\d+',ss)
x2= re.findall('\d',m2[0])
x3= re.findall('\d',m2[1])
#print(m2[:])
#print(''.join(x2[:]),''.join(x3[:]))
knb1=int(''.join(x2[:]))
knb2=int(''.join(x3[:]))
print(str(knb1),str(knb2))
except Exception as e:
knb1=0
knb2=0
#print(e)
pass
print(knb1,knb2)
#print('非数据格式')
return knb1,knb2
ss='K26+158~K26+184' #这个是需要被识别,转化的数据示例,用来测试函数的功能,然后用他锁定数据范围
a,b=stloc(ss)
print(a,b,'测试')
还有一个识别是否存在汉字的也放出来学习。代码是 我搜的。忘了那个地址了。要是涉及产权的,联系一下我,我及时删除,按理说就几行代码,估计没啥产权。而且是很容易搜索到的。
def is_contain_chinese(check_str):
"""
判断字符串中是否包含中文
:param check_str: {str} 需要检测的字符串
:return: {bool} 包含返回True, 不包含返回False
"""
for ch in check_str:
if u'\u4e00' <= ch <= u'\u9fff':
return True
return False