有时候我们会将csv文件的某列对应某列(或这某几列);如{A:[B,C,D,E]},说白了就是一个键对应的值是一个列表,但是有时候我们的值在表头中位置不一致,这时候我们就需要先获取每一个字段的索引值,这样程序就会通过索引值自动找到对应的值在表头中的索引。
如下图(我故意写反了):
1、将A列作为键
2、将[寄件网点,派件网点]作为值,但是位置不一定
解决方案,找到索引,前提是字段必须在表头中
import csv
with open('./原始账单大网(csv)/' + f, newline='', encoding='utf-8') as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
zd_list = ['寄件网点', '派件网点']
indexs_list = []
for row in reader:
count += 1
if count == 1:
for z in zd_list:
indexs_list.append(row.index(z))
else:
print(indexs_list)
break
成功找到
下面是作json文件
1、 list_a.append((row[0], row[indexs_list[0]] + “=” + row[indexs_list[1]]))
2、row[0],这个就是我的A列,也就是键
3、 row[indexs_list[0]] + “=” + row[indexs_list[1]],这个就是我的值[‘寄件网点’, ‘派件网点’],中间通过“=”,等号连接,方便split切割,当然可以继续添加其他字段
import json
import os
from collections import defaultdict
import csv
def write_json():
for f in os.listdir('./数据源(csv)/'):
list_a = []
d = defaultdict(list)
count = 0
print(f)
with open('./数据源(csv)/' + f, newline='', encoding='utf-8') as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
zd_list = ['寄件网点', '派件网点']
indexs_list = []
for row in reader:
count += 1
if count == 1:
for z in zd_list:
indexs_list.append(row.index(z))
else:
list_a.append((row[2], row[indexs_list[0]] + "=" + row[indexs_list[1]]))
for key, value in list_a:
d[key].append(value)
with open(f"./json文件/{f}.json", "w", encoding="utf-8") as f_w:
f_w.write(json.dumps(d, ensure_ascii=False))
print(f"{f},转换json成功")
然后是将刚刚的json文件合并成一个
def merge_json():
merged_data = {}
for file in os.listdir("./json文件/", ):
with open("./json文件/" + file, 'r', encoding="utf-8") as f:
data = json.load(f)
merged_data.update(data)
with open("合并json/res.json", 'w', encoding="utf-8") as f:
json.dump(merged_data, f, ensure_ascii=False)
最后是匹配
import json
import os
import numpy as np
import openpyxl
import pandas
wb = openpyxl.load_workbook("./模板(勿动)/"+os.listdir("./模板(勿动)/")[0])
ws = wb.active
with open("合并json/res.json", "r", encoding="utf-8")as f:
res = json.load(f)
df = pandas.read_excel("./数据源/"+os.listdir("./数据源/")[0],usecols="A",dtype=str,keep_default_na='')
ydh_list = np.asarray(df.stack())
for y in ydh_list:
res2 = res.get(y,"-")
if res2 != "-":
ws.append([y,res2[0].split("=")[0],res2[0].split("=")[1]])
else:
ws.append([y,'',''])
wb.save("./匹配结果.xlsx")
全部匹配到,当然匹配不到可以为空,代码里我也加了
其中合并json那一步应该是可以省略的,因为我们上一步可以全部读取完,直接写在一个json文件里,大家可以自己完善一下!
希望对大家有帮助!!
更多关于办公自动化的知识,请关注我吧
更多关乎Excel操作请关注我的专栏吧