python读取CSV文件表头字段乱序作json文件(自己笔记)

有时候我们会将csv文件的某列对应某列(或这某几列);如{A:[B,C,D,E]},说白了就是一个键对应的值是一个列表,但是有时候我们的值在表头中位置不一致,这时候我们就需要先获取每一个字段的索引值,这样程序就会通过索引值自动找到对应的值在表头中的索引。

如下图(我故意写反了):

1、将A列作为键

2、将[寄件网点,派件网点]作为值,但是位置不一定

python读取CSV文件表头字段乱序作json文件(自己笔记)_第1张图片
python读取CSV文件表头字段乱序作json文件(自己笔记)_第2张图片

解决方案,找到索引,前提是字段必须在表头中

import csv
with open('./原始账单大网(csv)/' + f, newline='', encoding='utf-8') as csvfile:
    # 读取 CSV 文件内容
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    # 遍历 CSV 文件中的每一行数据
    zd_list = ['寄件网点', '派件网点']
    indexs_list = []
    for row in reader:
        count += 1
        if count == 1:
            for z in zd_list:
                # print(row.index(z))
                indexs_list.append(row.index(z))
        else:
            print(indexs_list)
            break

成功找到

python读取CSV文件表头字段乱序作json文件(自己笔记)_第3张图片

下面是作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:
            # 读取 CSV 文件内容
            reader = csv.reader(csvfile, delimiter=',', quotechar='"')
            # 遍历 CSV 文件中的每一行数据
            zd_list = ['寄件网点', '派件网点']
            indexs_list = []
            for row in reader:
                count += 1
                if count == 1:
                    for z in zd_list:
                        # print(row.index(z))
                        indexs_list.append(row.index(z))
                else:
                    # print(indexs_list)

                    # 处理每一行数据
                    # print(row)
                    list_a.append((row[2], row[indexs_list[0]] + "=" + row[indexs_list[1]]))
        for key, value in list_a:
            d[key].append(value)  # 省去了if判断语句
        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():
    # 定义一个空的字典,用于存储合并后的json数据
    merged_data = {}
    # 遍历所有的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)
    # 将合并后的json数据写入到merged_file中
    with open("合并json/res.json", 'w', encoding="utf-8") as f:
        json.dump(merged_data, f, ensure_ascii=False)  # 防止中文乱码


# merge_json()

最后是匹配

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)

# print(res['SF16xxxxxxx'])

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:
    # print(y)
    res2 = res.get(y,"-")
    if res2 != "-":
        ws.append([y,res2[0].split("=")[0],res2[0].split("=")[1]])
    else:
    	ws.append([y,'',''])


wb.save("./匹配结果.xlsx")

全部匹配到,当然匹配不到可以为空,代码里我也加了

python读取CSV文件表头字段乱序作json文件(自己笔记)_第4张图片

其中合并json那一步应该是可以省略的,因为我们上一步可以全部读取完,直接写在一个json文件里,大家可以自己完善一下!

希望对大家有帮助!!

更多关于办公自动化的知识,请关注我吧

更多关乎Excel操作请关注我的专栏吧

你可能感兴趣的:(Python自动化办公,python,json,笔记)