1. 程式人生 > 其它 >寫入excel表程式碼筆記

寫入excel表程式碼筆記

本篇主要記錄寫入excel程式碼邏輯

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/03/05
# @Author  :
# @Desc    : 存入excel表
import json
import os
import pandas
import requests
from config import *


# 傳遞引數進來 然後請求介面資料 取出資料進行差值計算
class RedisExcel:
    def __init__(self, single_prov, prov_id, type_class):
        
''' 物件傳參進來 ''' self.r = QUA_REDIS_CONN self.batch = 500 self.prov_id = prov_id self.type_class = type_class self.single_prov = single_prov self.file_name = '{}.xls'.format(single_prov) self.key_name = 'origin_qua_data:{}:qualification_num
'.format(single_prov) self.get_qua_url = ‘自己獲取的介面’ self.get_design_url = ‘自己獲取的介面’ # 設計資質 self.design_key_name = 'origin_design_data:{}:qualification_num'.format(single_prov) self.headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36
', 'Connection': 'keep-alive', } def read_data_of_batch(self): """ 施工資質取一個批次,資料量不大500以內可以一次性取出來,然後請求介面進行對比差集 """ if self.type_class == 'qua': data_list = self.r.lrange(self.key_name, start=0, end=-1) # 0-499 500-999 response = requests.get(url=self.get_qua_url, headers=self.headers, timeout=90).content.decode("utf-8") else: data_list = self.r.lrange(self.design_key_name, start=0, end=-1) # 0-499 500-999 response = requests.get(url=self.get_design_url, headers=self.headers, timeout=90).content.decode("utf-8") json_loads = json.loads(response) sys_num_list = list() num_4k1_list = list() for data in data_list: # 返回redis快取的資料 # data_4k1 = model.decode('utf-8') num_4k1_list.append(json.loads(data.decode('utf8')).get('result')) # 解碼 for qua in json_loads.get('data'): # 介面返回的資料 sys_qua_name = qua.get('qualificationName') + qua.get('qualificationLevel') # 名稱 sys_num = qua.get('num') # 數量 data_system = {'province': self.single_prov, 'prov_id': int(self.prov_id), 'qua_name': sys_qua_name.replace('資質', '').replace('分項', '').replace('', '(').replace('', ')').replace('', ''), 'num': sys_num} sys_num_list.append(data_system) num_4k1_set_add, sys_num_set_add = self.get_system_account(num_4k1_list, sys_num_list) num_4k1_list += num_4k1_set_add sys_num_list += sys_num_set_add answer_num_list = [] # _4k1_list = [] # sys_list = [] for qca_4k1 in num_4k1_list: qca_name = qca_4k1.get('qua_name') num_4k1 = qca_4k1.get('num') for qca_sys in sys_num_list: if qca_name == qca_sys.get('qua_name'): num_sys = qca_sys.get('num') # _4k1_list.append(num_4k1) # sys_list.append(num_sys) answer_num = num_sys - num_4k1 # 差值 data_qua = {'province': self.single_prov, 'prov_id': self.prov_id, 'qua_name': qca_name, 'system_num': num_sys, 'num_4k1': num_4k1, 'answer_num': answer_num} answer_num_list.append(data_qua) return answer_num_list def get_system_account(self, num_4k1_list, sys_num_list): """ 讓他們的長度一樣,不一樣則相互補充 """ num_4k1_set = set(map(lambda i: i.get('qua_name'), num_4k1_list)) # 獲取4k1資質個數 sys_num_set = set(map(lambda i: i.get('qua_name'), sys_num_list)) # 獲取系統資質個數 num_4k1_key_set_add = sys_num_set - num_4k1_set # 獲取資質差集 sys_num_key_set_add = num_4k1_set - sys_num_set # 獲取資質差集 num_4k1_set_add = [{'prvince': self.single_prov, 'prov_id': int(self.prov_id), 'qua_name': qca_name, 'num': 0} for qca_name in num_4k1_key_set_add] sys_num_set_add = [{'prvince': self.single_prov, 'prov_id': int(self.prov_id), 'qua_name': qca_name, 'num': 0} for qca_name in sys_num_key_set_add] return num_4k1_set_add, sys_num_set_add def read_redis(self): """ 分批次取出資料 """ data_list = self.read_data_of_batch() if not data_list: return None yield data_list def creat_key(self) -> dict: """ 生成鍵,即生成excel表中的列名 """ data_dict = dict() name_list = ['province', 'prov_id', 'qua_name', 'system_num', 'num_4k1', 'answer_num'] for k in name_list: data_dict[k] = list() return data_dict def create_data(self): """ 組建特殊格式 """ for data_list in self.read_redis(): if data_list: data_dict = self.creat_key() for data in data_list: if isinstance(data, str): data = json.loads(data) for k, v in data.items(): data_dict[k].append(v) yield data_dict def write_excel(self): if self.file_name in os.listdir('./'): os.remove('./' + self.file_name) for d in self.create_data(): dir = os.listdir('./') if self.file_name not in dir: open('./' + self.file_name, 'w') pd = pandas.DataFrame(d) pd.to_excel(excel_writer=self.file_name, index=False) else: new = pandas.DataFrame(d) pd = pandas.read_excel('./' + self.file_name, index_col=False) pd = pd.append(new) pd.to_excel(excel_writer=self.file_name, index=False)
View Code

os模組獲取當前路徑

import os

BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
print(BASE_DIR)

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print(BASE_DIR)

BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "../.."))
print(BASE_DIR)

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
print(BASE_DIR)