python excel表格处理——【pandas, openpyxl, xlwt的使用】

​一、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',创建时间从2023610日至今
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周报')

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值