关键词:python csv xls pandas xlrd
接到同事的抱怨,说每个月需要对比详单,审计是否有违规操作。
vlookup拖一拖?
——行数太多,电脑卡死> <
那你现在怎么做的?
——正则把号码选出来放一列,然后到另一个表里ctrl+f。
21世纪了竟然还有这么男默女泪的事情发生在周围,义不容辞mission accepted,说你把原表给我吧,以后每个月你只要点一下就行,点两下算我输。
openpyxl都准备好了,磨刀霍霍杀过去发现一个表是xls,一个表是csv,不支持……
哎呀这个,你原表导出来的时候能不能选格式?
——???
你这些工单为什么还要合并,我模块读不了……
——???
合并就算了为什么有的是str有的是int有的是float,录入的时候能不能规范下格式?
——???
作为一个程序猿竟然给客户提这么多要求……回头看看真是无地自容。为了保住职业操守,challege accepted,点两下算我输。
先上最终代码,由于隐私问题不效果演示了,就是从表a某列提关键词然后去表b匹配,再返还同行的值。如果都是xlsx的话根据我写月报的经验已经轻松应对了,但涉及到csv和合并项于是意外的花了很多时间。(程序员加班,能算加吗?)
def fulfill(pdcsv):#提取号码
pdcsv['手机号'] = ''
pdcsv['工单编号'] = ''
pdcsv['操作内容'] = ''
index = 0
for i in range(len(pdcsv)):
if index == 0:#寻找手机号所在列
for x in range(len(pdcsv.loc[0])):
if pdcsv.loc[i][x] == '事件内容':
index = x
else:#提取手机号,放入倒数第三列
temp = pdcsv.loc[i][index]
phone = re.findall(r'[0-9]{11}',temp) #匹配手机号
if phone:
pdcsv.loc[i][-3] = phone[0]
def match(pdcsv,sheet):
for i in range(len(pdcsv)):
phone = pdcsv.iloc[i][-3]
if phone:#仅处理非空行
for n in range(sheet.nrows):
if str(sheet.cell(n,2).value).replace('.0','') == phone: #手机号为第2行
x = n
while sheet.cell(x,4).value == '':#处理合并项
x -= 1
pdcsv.loc[i][-2] = sheet.cell(x,7).value#复制查询单编号
pdcsv.loc[i][-1] = sheet.cell(x,4).value#复制查询内容
#print(pdcsv.loc[i][-1])
def main():
csvfile = open(r'C:\Users\ben\Desktop\ZSGA0001.csv','r')#注意修改csv文件位置
pdcsv=pandas.read_csv(csvfile)
fulfill(pdcsv)
print('已提取号码')
xlsfile = xlrd.open_workbook(r'C:\Users\ben\Desktop\查询明细201706.xls','r')#注意修改xls文件位置
sheet = xlsfile.sheets()[0]
match(pdcsv,sheet)
print('查询操作是否有相应来单,如有,复制工单编号')
#print(pdcsv.loc[1:23])
pdcsv.to_csv(r'C:\Users\ben\Desktop\ZSGA0003.csv')
整体思路是用xlrd来读取手动录入的工单.xls,用pandas来处理csv文件。过程中有这么几个注意的地方:
openpyxl其实也支持xls,但对合并格的读取我不是很明白……所以干脆换新模块处理xls。读是xlrd,写是xlwt(当然这里不用)
-
csv文件的话用pandas读写都挺好(而且名字萌),但注意要安装好numpy+mkl,在线各种失败,最后离线下载(这个文件100多m吓死人)然后pip install wheel搞定。(各种调用失败的时候差点想文本读取,sep=‘,')
- 顺便说一下在同事的32位系统里直接pip install pandas 就成功了……|||
-
一开始运行的时候合并项没有匹配到,以为是合并的读取写错了,测试了下没问题,只好把读取列+序号输出,发现有的号码录入成float,所以字符匹配的时候不相等。考虑过eval,但是由于还有别的信息干扰,最终采取 str(value.replace('.0','') 解决。
- 顺便说一下合并项在xlrd里读取时,首行是合并值,其他行是空。用个递减循环处理。
再执行的时候发现.loc[m][n]重新赋值没有写成功,多次检查甚至新建一个也无法赋值……提示warning把一个值赋给slice。这灵异事件困扰了我好久,还以为之前修改成功的记忆是自己的幻觉。最终,重启解决(真是灵异了)
p.s.1:执行出错的时候冷静下看看自己的桌面,分小段调试,logging检查。
p.s.2:其实中途出现很多灵异意外结果的时候我很想和朋友说一声要不你手动把CSV和XLS贴在一个XLSX里再执行代码?(闭嘴)
p.s.3.:怎么办我发现最后执行的时候还需要手动输入文件名,是不是算我输了()
p.s.4:同事问为什么不搞个access数据库算了还一劳永逸……我……因为我的心已经给了python?