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)
python 封装的一些表格处理函数
最新推荐文章于 2024-11-14 13:48:50 发布