Python提取 Excel内容,这个需求头一次见,千个表,十行代码_python从1000个表格中提取数据(1)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Python全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注Python)
img

正文

xw.App(visible=False,add_book=False) 

其中:

  • visible: True表示启动excel程序后显示程序窗口。如果为False,表示启动excel程序后,程序窗口在后台运行;
  • add_book: True表示启动excel程序后,新建一个空白工作簿。如果为False,表示启动excel程序后,不新建工作簿;

app.books.open(文件路径)

上述函数用于帮助我们打开工作簿,里面有一个参数,传入本地excel的路径,用于打开本地的工作簿。

完整代码

因为这篇文章,只是简单介绍了xlwings库的相关使用,有些属性和方法类似于openpyxl,这里我就不详细介绍了。Excel文本框中内容如下:

img

直接上代码:

import xlwings as xw  
app = xw.App(visible=False,add_book=False)  
wb = app.books.open('test1.xlsx')  
for sheet in wb.sheets:  
    for shape in sheet.shapes:  
        if "TextBox" in shape.name:  
            print(shape.text) # 一定要xlwings最新版本,老版本没有text方法          
wb.close()  
app.quit() 

结果如下:

img

当然,这是针对某一个表,掌握了方法,给你多个表,不就是循环读取就行吗?

1000个表,自己可以下去尝试一下哦!

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析学习等教程。带你从零基础系统性的学好Python!

👉Python学习路线汇总👈

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取哈)
在这里插入图片描述

👉Python必备开发工具👈

img

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

👉实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

👉100道Python练习题👈

检查学习结果。
在这里插入图片描述
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
升。**

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
[外链图片转存中…(img-6cr4ZCm4-1713361919389)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

<think>我们面对的问题:处理多行的DataFrame,并希望指定单一(通常是最后一行)作为列名,忽略上方的多余行。 解决方案步骤: 1. 读取数据时跳过前几行(直到真正的列名所在行) 2. 将真正的列名所在行作为header 3. 重新设置列名并丢弃之前的行 例如,假设我们有一个Excel文件,前两行是无关的,第三行才是真正的列名。我们可以这样读取: ```python import pandas as pd # 读取文件,跳过前n行,并指定第m行作为列名(行号从0开始) # 假设真正的列名在第3行(即索引为2的行),跳过前2行 df = pd.read_excel('file.xlsx', skiprows=2) ``` 但是,如果多行中,我们想指定其中一行作为列名,并且这一行不一定在最后,我们可以先读取全部内容,然后手动设置列名并删除多余行。 更通用的方法: 步骤1:读取文件,不设置(header=None),这样所有行都作为数据读入。 步骤2:找到我们想要作为列名的那一行(比如第k行,注意索引从0开始)。 步骤3:将这一行设置为列名。 步骤4:删除这一行之前的所有行(以及这一行本身,因为现在它已经是列名了,不再需要作为数据行)。 步骤5:重置索引(如果需要)。 示例代码: ```python import pandas as pd # 读取文件,不设置,所有行作为数据 df = pd.read_excel('file_with_multiple_headers.xlsx', header=None) # 假设我们想要将第3行(索引为2)作为列名 header_row_index = 2 # 提取这一行作为列名 new_columns = df.iloc[header_row_index].values # 将这一行之后的数据保留(即删除这一行及之前的所有行) df = df.iloc[header_row_index+1:] # 设置列名 df.columns = new_columns # 重置索引(可选) df.reset_index(drop=True, inplace=True) ``` 但是,如果我们的有多行,而我们只想要最后一行作为列名,那么我们可以这样简化: ```python # 读取文件,不设置 df = pd.read_excel('file.xlsx', header=None) # 获取最后一行作为列名 new_columns = df.iloc[-1].values # 保留最后一行之后的数据?这样不行,因为最后一行之后没有数据了。所以我们要保留最后一行之前的数据,并将最后一行设为列名。 # 正确做法:我们想要保留除了行(包括最后一行)之外的所有数据行。 # 假设有n行,我们想要最后一行作为列名,那么数据行从第n行开始(0-indexed,第n行就是第n+1行,但有n行,所以数据行从第n行开始?) # 更合理的做法:我们指定行为第k行(最后一行),那么数据行就是k+1行开始。 # 但是,我们读取时已经把所有行都读进来了,包括行和下面的数据行。 # 假设我们已知有3行,我们想用第3行(索引2)作为列名,那么数据行从索引3开始。 # 我们可以这样做: # 设置列名 df.columns = df.iloc[2] # 将第三行设置为列名 df = df.iloc[3:] # 丢弃前三行(包括行),从第四行开始作为数据 # 重置索引 df.reset_index(drop=True, inplace=True) ``` 如果不知道有多少行,但知道最后一行所在的行号,我们可以用上面的方法。 但是,如果行数不固定,但我们可以通过内容判断(比如最后一行下面就是数据),我们可以尝试自动检测: 思路:找到第一个非空行(或者符合列名特征的行)作为列名,但这样可能不可靠。 因此,最可靠的方法还是用户指定所在行号。 另外,如果文件很大,我们也可以只读取前几行来确定位置: ```python # 读取前10行 df_head = pd.read_excel('file.xlsx', header=None, nrows=10) # 假设我们通过观察知道第5行是真正的列名(索引4) header_row_index = 4 # 然后重新读取整个文件,跳过header_row_index行之前的所有行,并设置header_row_index行为列名 df = pd.read_excel('file.xlsx', skiprows=header_row_index) # 注意:这样读取后,列名就是header_row_index行,而数据从下一行开始 ``` 但是,这种方法需要读取文件两次,如果文件很大,我们可以采用第一种方法(先全部读取,再处理)但只读取一次。 总结:核心是确定真正列名所在的行号,然后将其设为列名,并删除该行之前(包括该行)的所有行。 注意:如果有合并单元格,可能会导致读取时出现NaN,需要额外处理。这种情况下,可能需要使用`openpyxl`等库先处理合并单元格,但这不是本问题的重点。 下面是一个完整的示例,假设我们有一个Excel文件,前两行是多级,第三行是真正的列名(即我们想要的单一),我们读取该文件并设置第三行为列名: ```python import pandas as pd # 方法1:读取时跳过前两行,并指定第一行为列名(即原文件的第三行变成了新数据的第一行,我们将其作为列名) # 注意:skiprows=2 示跳过前两行(0-indexed,即第1行和第2行),然后读取时第一行(原第三行)作为列名 df = pd.read_excel('multi_header.xlsx', skiprows=2) # 方法2:如果跳过前两行后,第一行就是列名,那么这样读取后,列名就是原第三行,数据从第四行开始。 # 但是,如果第三行并不是我们想要的列名,而是第四行,那么我们可以调整skiprows。 # 方法3:如果我们不确定,或者行数不固定,我们可以先读取前几行进行判断,然后再读取整个文件。 # 示例:读取前5行判断结束位置 preview = pd.read_excel('multi_header.xlsx', header=None, nrows=5) # 假设我们通过某种条件判断第3行(索引2)是列名行(例如,该行没有空值,或者该行是我们想要的列名格式) # 这里我们假设通过观察,第3行(索引2)是列名 header_row = 2 # 索引2代第三行 # 然后我们重新读取,跳过header_row行(即跳过0,1,...,header_row-1,共header_row行) df = pd.read_excel('multi_header.xlsx', skiprows=header_row) # 这时,原文件中的第header_row+1行(即第三行)成为了新DataFrame的第一行,并且被设置为列名(因为read_excel默认将第一行作为列名) # 但是,这样读取后,原文件中的header_row行成为了列名,而header_row+1行开始的数据成为了数据行(第一行数据是原文件的第header_row+1行)。 ``` 注意:在读取时使用`skiprows`并配合`header=0`(默认)会将跳过指定行后的第一行作为列名。 如果不想重新读取文件,我们可以用之前的方法(先读取全部,再处理)。 根据用户需求,我们可能希望忽略其他,只保留一个行。以上方法都可以实现。 选择哪种方法取决于文件大小和复杂程度。对于大文件,重新读取可能会影响性能,因此建议一次性读取并处理。 下面是一个一次性读取并处理的通用函数: ```python def read_with_single_header(file_path, header_row_index, sheet_name=0): """ 读取具有多行Excel文件,并指定某一行作为列名(单一) 参数: file_path: Excel文件路径 header_row_index: 作为列名的行索引(0-indexed) sheet_name: 工作名,默认为第一个工作 返回: 处理后的DataFrame """ # 读取整个工作,不设置列名 df = pd.read_excel(file_path, header=None, sheet_name=sheet_name) # 设置列名为指定行 df.columns = df.iloc[header_row_index] # 删除行(包括指定的列名行)之前和该行本身,保留该行之后的数据 df = df.iloc[header_row_index+1:] # 重置索引 df.reset_index(drop=True, inplace=True) return df # 使用示例 df = read_with_single_header('multi_header.xlsx', header_row_index=2) ``` 这样,我们就得到了一个只有单一的DataFrame,且数据从原行的下一行开始。 注意事项: 1. 如果指定的列名行有缺失值(NaN),那么列名中也会包含NaN,这可能导致问题。我们可以用`fillna`方法填充缺失列名,例如: ```python # 在设置列名前填充缺失值 new_columns = df.iloc[header_row_index].fillna('missing').values df.columns = new_columns ``` 2. 如果列名有重复,我们可以通过添加后缀等方式解决,但这里不展开。 以上方法适用于Excel和CSV文件(CSV使用`pd.read_csv`,参数类似)。 希望这个解决方案能帮助用户处理多行的问题。</think>### 处理多行DataFrame的完整指南 在Python中处理具有多行Excel/CSV数据时,可通过以下方法提取单一并忽略其他行: #### 核心解决方案:使用`header`参数指定行 ```python import pandas as pd # 原始数据示例(多行): # | | 销售数据 | | # | 地区 | 第一季度 | 第二季度 | # |------|----------|----------| # | 北京 | 100 | 150 | # 方法1:指定最后一行作为 df = pd.read_excel('data.xlsx', header=2) # 索引2示第三行 print(df.columns) # 输出:Index(['地区', '第一季度', '第二季度'], dtype='object') # 方法2:跳过前N行 df = pd.read_excel('data.xlsx', skiprows=2) # 跳过前两行 ``` #### 多数据处理流程 ```mermaid graph LR A[原始文件] --> B[多行数据] B --> C{指定位置} C --> D1[header参数] C --> D2[skiprows参数] D1 --> E[正确DataFrame] D2 --> E E --> F[数据处理] ``` #### 完整处理示例 ```python # 步骤1:读取时指定行 df = pd.read_csv('multi_header.csv', header=2) # 步骤2:验证列名 print("提取的列名:", df.columns.tolist()) # 步骤3:清理数据(可选) df = df.dropna(how='all') # 删除全空行 df = df.reset_index(drop=True) # 重置索引 # 步骤4:使用标准DataFrame操作 df['总销售额'] = df['第一季度'] + df['第二季度'] print(df.head()) ``` #### 高级场景处理 1. **动态确定位置** ```python # 读取前5行检测 preview = pd.read_excel('data.xlsx', header=None, nrows=5) # 查找包含特定关键词的行 header_row = None for i in range(5): if '地区' in preview.iloc[i].values: # 根据关键词定位 header_row = i break if header_row is not None: df = pd.read_excel('data.xlsx', header=header_row) ``` 2. **处理多级合并** ```python # 读取所有行(包括) full_data = pd.read_excel('data.xlsx', header=None) # 提取最后一行作为列名 new_columns = full_data.iloc[2].values # 假设第三行是真实 # 保留数据行 df = full_data.iloc[3:] # 从第四行开始是数据 df.columns = new_columns # 设置新列名 ``` #### 常问题解决方案 | 问题类型 | 解决方案 | 代码示例 | |---------|---------|---------| | 跨多行 | 指定最后有效行 | `pd.read_excel(header=2)` | | 含合并单元格 | 预处理Excel文件 | 使用`openpyxl`解合并 | | 有额外说明 | 跳过说明行 | `skiprows=[0,1]` | | 动态位置 | 关键词搜索定位 | 上方动态定位示例 | | 含空值 | 填充空 | `df.columns.fillna('Unnamed')` | #### 最佳实践建议 1. 使用`pd.read_excel(header=2)`直接指定行位置 2. 读取后立即验证列名:`df.columns.tolist()` 3. 处理前清理无效行: ```python df = df.dropna(how='all') # 删除全空行 df = df.loc[:, ~df.columns.str.contains('Unnamed')] # 删除未命名列 ``` 4. 使用`infer_datetime_format=True`自动解析日期列 5. 对于超大文件,使用`chunksize`参数分块处理 > 处理多行的关键在于准确识别真实行的位置,使用`header`参数可直接提取有效列名[^1]。对于复杂结构,建议先进行小规模数据预览确定位置[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值