python 封装的一些表格处理函数

import sys
import os
import numpy as np
import pandas as pd
import yaml
import datetime
# import openpyxl as px

def get_current_time() -> str:
    """"获取当前时间str格式"""
    day_Week = datetime.datetime.now().isoweekday()
    nowtime = datetime.datetime.now()
    delta = datetime.timedelta(days=7 + day_Week)
    n_days = nowtime - delta
    return n_days.strftime(f'%Y_%m_%d_%H_%M_%S')

def convert_csv_to_xlsx(directory, filename, result=''):
    """将单个csv表格转换成xlsx"""
    csv_file = os.path.join(directory, filename)
    if result == '':
        result = os.path.join(directory, r'result_' + get_current_time())
    xlsx_file = os.path.join(result, filename[:-4] + ".xlsx")
    
    df = pd.read_csv(csv_file, encoding='gbk')
    df.to_excel(xlsx_file, index=False, sheet_name='Sheet1')
    
def convert_all_csv_to_xlsx(directory):
    """将文件夹内的所有csv表格转换成xlsx"""
    counter = 0
    # 创建输出目录
    result = os.path.join(directory, r'result_' + get_current_time())
    if os.path.exists(result) != True:
            os.makedirs(result, mode=0o777)
            
    for filename in os.listdir(directory):
        if filename.endswith(".csv") or filename.endswith(".CSV"):
            convert_csv_to_xlsx(directory, filename, result)
            counter += 1
            
    if counter == 0:
        print(f"[log info]: failed, directory do not has .csv, counter={counter}")
    else:
        print(f"[log info]: success, directory has .csv, counter={counter}")
        
def excel_drop_duplicates(file, subset=[]):
    """去除表格中的重复行"""
    df = pd.read_excel(file)
    if len(subset) == 0:
        df = df.drop_duplicates() # 删除所有列相同的行
    else:
        df = df.drop_duplicates(subset=subset) # 根据某些列删除重复行
    output = file[:-5] + "_output.xlsx"
    df.to_excel(output, index=False)
    

    # 输入为一个字典
    # dict
    # left_file: 左表
    # right_file: 右表
    # left_id: 需要匹配的左表列
    # right_id: 需要匹配的右表列
    # left_col_name: 需要读取的左表列
    # right_col_name: 需要读取的右表列
    # how: 'left' 规定按照左表来处理
    """
    在Python的pandas库中,pd.merge()函数用于将两个DataFrame对象按照指定的键进行合并。其中,how参数用于指定合并的方式,具体含义如下:
    'left': 以左侧DataFrame(df1)为基准,将右侧DataFrame(df2)的数据与左侧DataFrame进行合并。如果右侧DataFrame中存在与左侧DataFrame不匹配的键值,那么这些行将被保留在结果中,但对应的列值将为NaN。
    'right': 以右侧DataFrame(df2)为基准,将左侧DataFrame(df1)的数据与右侧DataFrame进行合并。如果左侧DataFrame中存在与右侧DataFrame不匹配的键值,那么这些行将被保留在结果中,但对应的列值将为NaN。
    'outer': 对两个DataFrame进行全外连接,即保留两个DataFrame中的所有键值。如果某个键值只存在于一个DataFrame中,那么另一个DataFrame中对应的列值将为NaN。
    'inner': 对两个DataFrame进行内连接,即只保留两个DataFrame中共有的键值。如果某个键值只存在于一个DataFrame中,那么该行将被删除。
    """
def left_vlookup_from_right(config):
    """从左表中 查找右表中指定col能匹配上的 保留左表 没匹配上的填NA"""
    # 是否会将整个表格列合并,如果只要某些列的话,可以从表中先抽合并,然后抽取列组成新表
    left_file = config['dir'] + config['left_file']
    right_file = config['dir'] + config['right_file']
    left = pd.read_excel(left_file, usecols=config['left_col_name'])
    right = pd.read_excel(right_file, usecols=config['right_col_name'])
    result = pd.merge(left, right, left_on=config['left_id'], right_on=config['right_id'], how=config['how'])
    
    # 这里还可以添加其他操作例如先处理表格
    output = left_file[:-5] + "_output_vlookup.xlsx"
    result.to_excel(output, index=False)
    

if __name__ == "__main__":
    dir = r'.\csv'
    # convert_all_csv_to_xlsx(dir)
    
    # subset = ['log err']
    # excel_drop_duplicates(r'.\csv\input.xlsx', subset)
    
    # 后面修改成通过 yaml 文件读取配置
    config = {
        'dir': 'G:\codehub\python\excel_process\csv\\',
        'left_file': 'input - 副本 (6) - 副本.xlsx',
        'right_file': 'input - 副本 (7) - 副本.xlsx',
        'left_id': 'log err',
        'right_id': 'log err',
        'left_col_name': ['打印次数', 'log err', '详情', '责任组', '责任人'],
        'right_col_name': ['log err', '分析结果', '黑名单', '白名单'],
        'how': 'left'    
    }
    left_vlookup_from_right(config)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值