我有一份excel,A列是标题,带有xlsx、pdf、jpg等二十种格式,或者标题带有microsoft word、excel、powerpoint等N种字样,我希望凡是在A列里查找出含有xlsx字样的,就在同一行的B列赋值“excel”,然后,在【剩余】B列赋值为空的行里面,继续在A列查找带有jpg字样的,同样在B列赋值为“图片”,如此类推。
但是我发现在python立面用str.contains语句,假设A列里含有两个关键词,后一次赋值会把前一次赋的值覆盖掉。
举个例子:
第一次查找赋值的时候查找的关键字为pdf,查到A列有关键字pdf,于是在B列赋值pdf
A | B |
---|---|
标题 | 格式 |
图片.pdf |
但是第二次查找关键字为图片的时候,刚好A列的标题里面带有关键字【图片】,于是原来B列的值pdf被覆盖为图片
A | B |
---|---|
标题 | 格式 |
图片.pdf | 图片 |
有没有什么办法可以筛选赋值完一遍之后,剩余的操作是在B为空值的行来继续查询的呢?
import pandas as pd
if __name__ == '__main__':
# 规则字典,什么要替换成什么
rule = {'xls': 'excel', 'pdf': 'pdf', 'doc': 'word', 'word': 'word', 'acrobat': 'pdf', 'ppt': 'ppt',
'powerpoint': 'ppt', 'csv': 'excel', '照片': '图片', '截图': '图片'}
df = pd.read_excel("xx.xlsx")
df['打印文件名称'] = df['打印文件名称'].astype(str)
for i, r in df.iterrows():
suffix = r['打印文件名称'].split(".")[-1]
if suffix in rule:
# 有后缀,直接替换
df.loc[i, '格式'] = rule[suffix]
else:
# 没有后缀
for key in rule:
if key in r['打印文件名称']:
df.loc[i, '格式'] = rule[key]
break
print(df)
import openpyxl
workbook = openpyxl.load_workbook('test.xlsx')
ws = workbook.worksheets[0]
for index, item in enumerate(ws.values, 1):
if index == 1 or item[1] is not None:
continue
else:
if 'pdf' in item[0]:
ws.cell(index, 2).value = 'pdf'
elif '图片' in item[0]:
ws.cell(index, 2).value = '图片'
workbook.save('test.xlsx')
读取,遍历,判断
三板虎搞定。
有疑问来交流
用pandas库,你去搜pandas读取excel,还有基础操作,很简单