一、excel处理常用模块
二、模块使用
1、pandas
1)读取 excel 文件:pd.read_excel()
# 读取excel,创建DataFrame
# DataFrame:数据框,类似矩阵,同二维数组。python中没有数组,可理解为二位列表
df = pd.read_excel(excel_name)
df = pd.read_excel('DTS问题单列表.xlsx')
read_excel(excel_name, sheet_name)
a)sheet_name不写,默认值为0,指读取第一个sheet
b)sheet_name=None,指读取所有sheet
c)sheet_name通过sheet名称指定,读取指定的sheet
2)统计统计某个sheet的行数:shape[0]
#shape函数的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度,相当于行数。
num=df[sheet_name].shape[0]
num_rows=df[sheet_name].shape[0]
3)表格筛选:df[condition],condition为筛选条件
df_filtered = df[condition_gpu]
常用的筛选条件
实操举例
# '简要描述'中不包含'Daily,LLVM-15,Weekly,版本'中的任意一个
df_filtered=df_excel[~df_excel['简要描述'].str.contains('Daily|LLVM-15|Weekly|版本')]
筛选本周数据
# 筛选本周数据
today=datetime.today().date()
print(today)
# weekday() 表示一周的第几天,从0开始计数,星期一表示0
# today.weekday() 表示今天是本周的第几天,从0开始计数
print(today.weekday())
# timedelta() 表示两个 date 对象或者 time 对象,或者 datetime 对象之间的时间间隔,精确到微秒。
start_of_week=today-timedelta(days=today.weekday())
print(start_of_week)
# isin函数是内置函数,常用于判断一个数据是否在一个序列之中。序列可以是列表(list)、元组(tuple)、字典(dict)等
condition_week=((df['创建人'].isin(select_owner)) & (df['创建时间'].dt.date >= start_of_week))
df_filtered=df[condition_week]
df_filtered.to_excel('GPU_week.xlsx',index=False)
可参考:timedelta()函数使用
拓展:筛选时间
#筛选时间df['time']).dt.date,提取time数据的日期,精确到天
eg: df['创建时间']).dt.date>='2023-06-10',创建时间从2023年6月10日至今
condition_week=((df['创建人'].isin(select_owner)) & (df['创建时间'].dt.date >= start_of_week))
df_filtered=df[condition_week]
详细可参考:python处理时间格式:日期、时间、年、月、日、时刻、星期
4)写入不同sheet:实例化一个writer对象
# mode: "w" 写,"a"追加。默认为'w',会覆盖掉原来的所有内容,
# engine: xlsx格式的文件写入,通常用openpyxl。xlwt只能写xls格式文件
writer=pd.ExcelWriter(excel_name,mode='a',engine='openpyxl')
writer=pd.ExcelWriter(excel,mode='a',engine='openpyxl')
5)写入excel 文件:df.to_excel()
# 筛选后的数据写入指定sheet
#index=false 不写入索引,默认为True。索引:在源文件中的位置(除去第一行标题,从0开始计数)
df_filtered.to_excel(writer,index=False,sheet_name=label)
df_filtered.to_excel(writer,index=False,sheet_name='非daily')
6)xls格式转为xlsx
# 读取xls文件内容
df = pd.read_excel('summary.xls') # pandas读xls文件
# 将内容写入到xlsx文件
df.to_excel("summary.xlsx", index=False) # pandas写入xlsx
2、xlwt
1)创建新的Excel文件:xlwt.Workbook()
# utf-8 是 unicode 字符集一种编码方式。
# python3使用unicode字符集,而python2使用ASCII,所以python2使用中文很麻烦
work_book=xlwt.Workbook(encoding='utf-8')
2)创建新的sheet:add_sheet(sheet_name)
# 创建时指定sheet_name
sheet=work_book.add_sheet(sheet_name)
sheet=work_book.add_sheet('summary')
3)写入指定单元格
#row, col:从0开始
sheet.write(row,col, data)
sheet.write(i, 5, closed_count)
3、openpyxl
1)打开Excel文件:load_workbook(excel_name)
workbook = openpyxl.load_workbook(excel_name)
workbook = openpyxl.load_workbook('工作例会跟踪-2023.xlsx')
2)获取所有sheet名
sheet_names = workbook.sheetnames
3)通过sheet_name指定sheet
target_sheet = workbook[sheet_name]
# 遍历所有sheet,找到符合条件的最后一个sheet
# UnboundLocalError: local variable 'target_sheet' referenced before assignment(在赋值前引用局部变量’target_sheet’)
# 原因是python是解释型语言,python的变量不需要声明,但是需要初始化。
target_sheet = None
for sheet_name in reversed(sheet_names):
if '2023' in sheet_name and '-' in sheet_name:
target_sheet = workbook[sheet_name]
break
拓展:reversed()与reverse()函数
reversed() 是 python 的一个内置函数,对于给定的序列(如列表、元组、字符串以及 range() 区间)返回一个逆序序列。
1. 语法格式: reversed(seq)
2. 其中seq可以是列表,元素,字符串以及range()生成的区间列表
#将列表进行逆序
List = [1, 2, 3, 4, 5]
print([x for x in reversed(List)])
>>> [5, 4, 3, 2, 1]
reverse() 会改变原始列表。
List = [1, 2, 3, 4, 5]
List.reverse()
List
>>> [5, 4, 3, 2, 1]
4)读取指定单元格的内容
text=target_sheet.cell(row=start_cell.row, column=start_cell.column)
拓展:读取合并单元格的内容
# 获取合并单元格C4:J4
merged_cell=target_sheet['C4:J4']
# 获取合并单元格的左上角单元格,左上角索引一定为[0][0],因为索引从0开始
# 目标单元格在列数很多的情况下,方便使用,比如:AT6
start_cell=merged_cell[0][0]
cell = target_sheet.cell(row=start_cell.row, column=start_cell.column)
text=cell.value
# - `re.findall()`
# 函数可以在一段文本中查找所有匹配某个正则表达式的子串,并返回一个列表。
# - `\d` 表示匹配任意数字,`+` 表示匹配一个或多个数字。
# - `r`表示使用原始字符串,避免转义字符的影响。
numbers=re.findall(r'\d+',text)
#r的作用和\\的作用是一样的,都是防止程序将\当做转义字符
os.chdir(r'D:\GPU周报')