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