pandas处理excel文件处理,比较繁琐,需要的可以参考一下

import pandas as pd
import numpy as np
import time
import re
from pandas.core.frame import DataFrame
import copy


def new_sheet(filename):
    xlex = pd.ExcelFile(filename)
    writer = pd.ExcelWriter(filename)
    print('共' + str(len(xlex.sheet_names)) + '张表')
    print('原表读取中...')
    while True:
        try:
            for i in range(len(xlex.sheet_names)):
                all_df = pd.DataFrame(pd.read_excel(filename, xlex.sheet_names[i]))
                all_df.to_excel(writer, xlex.sheet_names[i], index=False)
                print('第' + str(i + 1) + '个表读取完毕')
            writer.save()
            writer.close()
            print('表格已全部读取完毕,请继续您的操作!')
            break
        except:
            times = 5
            print('{}s后从新刷新,请关闭需要操作的excel表格'.format(times))
            time.sleep(times)
            continue
    while True:
        print(xlex.sheet_names)
        sheet = input('请选择想要操作的表格:')  # 查询出文件中所有的表格名
        if sheet in xlex.sheet_names:
            df = pd.read_excel(filename, sheet)  # index_col 处理从哪列开始,下标
            break
        else:
            print('只能操作已经存在的表格哦,请选择已经存在的表!')
            continue
    while True:
        columns = list(df.columns.values)  # 头信息数据
        print(columns)
        check_col = input('选择想要去重的列:(一次仅可选择一列进行去重操作)').split()
        if len(check_col) > 1:
            print('去重列只支持单列去重哦!!!')
            continue
        else:
            check_col = check_col[0]
            if check_col in columns:
                col_index = columns.index(check_col)
                break
            else:
                print('请检查选择的列是否在备选方案中!!!')
                continue
    all_list = list(df.iloc[:, col_index].values)
    on_list = list(df.iloc[:, col_index].drop_duplicates())  # 去重之后的数据
    dicts = dict.fromkeys(on_list, [])
    # 循环得出最后的键为参数,值为列表,列表内包含的为对应字段的下标的字典
    long = len(dicts.keys())  # 总共长度
    ch_long = 0  # 当前位置,计算出当前的进度
    print('正在处理数据...')
    ch_list = []
    for i in dicts.keys():
        li = []
        ch_long += 1
        b = list(set(ch_list))
        for j in range(len(all_list)):
            if all_list[j] == i:
                li.append(j)
        dicts[i] = li
        ch_list.append(int((ch_long / long) * 100))
        a = list(set(ch_list))
        if long >= 100:
            if b == a:
                pass
            else:
                if len(a) > 100:
                    pass
                else:
                    print(str(len(a)) + '%', end=" ")
        else:
            print(str(round((ch_long / long) * 100, 2)) + '%', end=" ")
    print()
    print(columns)

    while True:
        check_list = set(input("选择需要进行操作的列:").split())  # 获取到选择的列
        if check_list.issubset(columns) == True:
            all_work = []
            index_list = []
            try:
                for i in check_list:
                    li_index = columns.index(i)  # 获取到的是所需要操作列的下标,用于修改值
                    index_list.append(li_index)
                for j in dicts.keys():
                    q = np.array([0 for i in range(len(df.iloc[dicts[j], index_list].values[0]))])
                    for i in df.iloc[dicts[j], index_list].values:  # 获得多个两个列表对应的所有数据,无需遍历表格
                        s = np.array(i)
                        q += s  # 对应列表相加,得到最后的数据
                    all_work.append(list(q))
                    all_work[on_list.index(j)].insert(0, j)  # 在插入的列数据中插入去重的列的数据
                break
            except:
                print('只有列的内容为数字时才可以进行求和计算,请重新选择需要操作的列')
                continue
        else:
            print('操作的列必须再备选方案中哦,请重新选择!')
            continue
    # new_list = on_list.insert(0, check_col)
    check_list = list(check_list)
    check_list.insert(0, check_col)  # 在写入的文件的列中插入去重列,直接全部写入
    asdf = DataFrame(all_work, columns=check_list)
    try:
        writer = pd.ExcelWriter(filename, mode='a')
        sheet_name = input('请输入要创建的表格的名称:').strip()
        print('数据正在写入中,请稍后...')
        asdf.to_excel(writer, sheet_name, index=False)
        writer.save()
        print('数据写入完毕!!!')
        writer.close()
    except:
        print('写入出错,请重新编写!!!')


def update_sheet(filename):
    xlex = pd.ExcelFile(filename)
    writer = pd.ExcelWriter(filename)
    print('共' + str(len(xlex.sheet_names)) + '张表')
    print('原表读取中...')
    while True:
        try:
            for i in range(len(xlex.sheet_names)):
                all_df = pd.DataFrame(pd.read_excel(filename, xlex.sheet_names[i]))
                all_df.to_excel(writer, xlex.sheet_names[i], index=False)
                print('第' + str(i + 1) + '个表读取完毕')
            writer.save()
            writer.close()
            print('表格已全部读取完毕,请继续您的操作!')
            break
        except:
            times = 5
            print('{}s后从新刷新,请关闭需要操作的excel表格'.format(times))
            time.sleep(times)
            continue
    while True:
        print(xlex.sheet_names)
        sheet = input('请选择想要操作的表格:')  # 查询出文件中所有的表格名
        if sheet in xlex.sheet_names:
            df = pd.read_excel(filename, sheet)  # index_col 处理从哪列开始,下标
            break
        else:
            print('只能操作已经存在的表格哦,请选择已经存在的表!')
            continue
    columns = list(df.columns.values)  # 头信息数据
    while True:
        try:
            print(columns)
            check_col = input('请选择要计算的列').split()
            arith = input('请输入要执行的算法:(+/-/*/\)')
            if arith == '+':
                col_mean = df[check_col].sum(axis=1)
            if arith == '*':
                col_mean = df[check_col].prod(axis=1)
            if arith == '-':
                first = copy.deepcopy(df[check_col[0]])
                for i in range(1, len(check_col)):
                    first -= df[check_col[i]]
                col_mean = first
            if arith == '/' or arith == '\\':
                first = copy.deepcopy(df[check_col[0]])
                for i in range(1, len(check_col)):
                    first /= df[check_col[i]]
                col_mean = first
            break
        except:
            print('只有数据之间可以进行计算哦,不同类型之间不能作为计算项来说!!')
            continue
    on_or = input('1、在原列中修改;!1、新创建一列数据:')
    if on_or == '1':
        # 在原列中进行修改
        while True:
            print(columns)
            checks = input('请选择修改那一列的内容:')
            if checks not in columns:
                s = input('请选择正确的列进行修改(Y:继续操作/N:返回操作)')
                if s == 'Y':
                    df[checks] = col_mean
                    break
                else:
                    continue
            else:
                df[checks] = col_mean
                break
    else:
        # 新建数据列
        while True:
            update = input('请输入要添加的列的名称:')
            if update not in columns:
                df[update] = col_mean
                break
            else:
                s = input('请输入没有在列表内的列哦,否则会覆盖原数据(Y:继续操作/N:返回操作):')
                if s == 'Y':
                    # checks = input('请选择修改那一列的内容:')
                    df[update] = col_mean
                    break
                else:
                    continue
    writer = pd.ExcelWriter(filename)
    df.to_excel(writer, sheet_name=sheet, index=False)
    writer.save()
    writer.close()
    print('文件写入完毕!')


if __name__ == '__main__':
    # filename= input('请选择要执行文件的路径:')
    filename = r'C:\Users\17660\Desktop\工作簿1.xlsx'
    while True:
        check = input('请输入要执行的操作:(1:合并相同行;其他:对列进行计算:)')
        if check == '1':
            new_sheet(filename)
            go = input('是否继续进行操作(Y/N)')
            if go == 'Y':
                continue
            else:
                break
        else:
            update_sheet(filename)
            go = input('是否继续进行操作(Y/N)')
            if go == 'Y':
                continue
            else:
                break

这是我写的对excel操作的基本运算,在新表格内进行添加还是在原来的表格内进行数据计算,新加列还是覆盖原本的数据进行了计算。最后通过

pyinstaller -F -w ***.py

进行了打包文件,执行的时候必须在文件对应的位置内进行打包,否则会出问题。
常见的打包方法:
打包成一个文件:-F 选项可以打出一个exe文件

pyinstaller -F **.py

去掉命令行黑框:-w 选项可以打桌面程序,去掉命令行黑框

pyinstaller -F -w **.py

修改程序默认图标:-i 可以设置图标路径,将图标放在根目录

pyinstaller -F -w -i **.ico **.py

你可能感兴趣的:(excel,pandas)