给我一份python代码,对当前目录下所有xlsx文件进行操作:取出第三列的非第二行的所有数到新xlsx文件的一列中,新xlsx这一列的第一行为原xlsx文件的文件名
时间: 2025-07-20 21:24:02 AIGC 浏览: 20
<think>我们当前的任务是:编写Python代码,读取当前目录下所有xlsx文件,提取每个文件的第三列(注意:第二行是标题行,所以从第三行开始取数据?但是题目说“除第二行外的所有数据”,所以第二行可能是标题,我们跳过第二行,从第三行开始取第三列的数据?)并且将原文件名作为新文件的第一列,提取的数据作为新文件的第二列(题目要求:将原文件名作为新xlsx文件的第一列,提取的数据作为第二列?因为题目说“连同原文件名作为新xlsx文件的第一列”,所以新文件有两列:第一列是原文件名,第二列是提取的第三列数据)。
但是,注意:题目要求提取的是“第三列除第二行外的所有数据”。这里可能有两种理解:
1. 每个xlsx文件可能有多个工作表?但是题目没有明确。根据示例引用,用户之前的例子是处理单个工作簿中的多个工作表。但这次要求是处理当前目录下的多个xlsx文件(每个文件可能有多个工作表?),但题目没有说明。我们假设每个xlsx文件只包含一个工作表?或者需要处理所有工作表?
但是,用户需求描述是:“提取第三列除第二行外的所有数据”。这里并没有提到多工作表的情况。为了简化,我们假设每个xlsx文件只有一个工作表,并且我们只处理第一个工作表(就像用户之前示例中那样,只处理第一个工作表?)。但是用户之前的示例(案例四)是循环处理一个工作簿中的所有工作表(除了最后一个)。然而,这次的需求是处理多个文件,每个文件可能有多个工作表?题目没有明确。
由于用户需求没有明确说明多工作表的情况,我们按照每个文件只处理第一个工作表来实现(因为这样最简单,也符合常见需求)。如果用户需要处理所有工作表,则需要额外说明。
因此,我们的步骤:
1. 遍历当前目录下所有xlsx文件(排除以~$开头的临时文件)。
2. 对于每个xlsx文件:
a. 打开文件,获取第一个工作表(或者活动工作表?)。
b. 跳过第二行(即第一行是标题?第二行可能是副标题?我们不要第二行,从第三行开始读取,直到最后一行)。
c. 读取第三列(即列索引为2,因为从0开始)的数据(从第三行开始,即行索引2开始)。
d. 将原文件名(不带路径)和该数据组合,形成一行。注意:一个文件会提取多个数据(每个数据是第三列的一行),所以每个数据都会对应一行,每一行包括:原文件名(重复出现)和该数据。
3. 将所有这些数据写入一个新的xlsx文件,新文件有两列:第一列是原文件名,第二列是提取的数据。
但是,注意:题目要求“提取第三列除第二行外的所有数据”,也就是说,第三列的数据从第三行开始(即跳过第二行)。所以,我们读取第三列时,从第三行开始(索引2)读取到末尾。
新文件的结构:
第一行:标题行,比如“文件名”和“数据”(用户没有指定,我们可以自定义,比如“来源文件”和“第三列数据”)
然后每一行:原文件名(不带路径),第三列对应行的数据。
注意:如果第三列的数据是空,我们是否保留?题目没有说,我们保留空值。
我们使用openpyxl库,因为用户之前的示例使用了openpyxl。
代码步骤:
1. 导入openpyxl
2. 获取当前目录下所有xlsx文件
3. 创建一个新的工作簿,并创建一个工作表
4. 在新工作表的第一行写入标题:['来源文件', '第三列数据']
5. 遍历每个xlsx文件:
使用openpyxl.load_workbook打开,注意设置data_only=True(如果需要公式的值,则设置,否则不设置)和read_only=True(可以提高读取大文件的性能)?但是read_only模式下不能使用某些属性,比如sheet.max_row。我们可以使用iter_rows。但是,如果文件不大,可以不使用read_only。
我们选择不设置read_only,因为文件可能不大。
获取第一个工作表:sheet = wb.worksheets[0] 或者 wb.active?但是用户可能保存了活动表,但为了统一,我们使用第一个工作表(索引0)。
然后,遍历第三列(即列C)从第三行(行索引2)开始到最后一行(注意:行索引从1开始,但openpyxl中行索引从1开始,列索引从1开始,所以第三列是列索引3?)
注意:openpyxl中列索引从1开始,行索引从1开始。所以第三列是3,第二行是行2,我们跳过行2,从行3开始。
但是,注意:题目要求“除第二行外”,也就是跳过第二行,从第三行开始。所以行号从3开始直到最大行。
我们这样获取最大行:sheet.max_row
然后循环行号从3到max_row,取每一行第3列的值。
将每个值与原文件名一起写入新工作表的行中(先写文件名,再写数据)。
6. 保存新的xlsx文件。
注意:文件名我们只取基本名称(不带路径),使用os.path.basename。
但是,如果文件很多,数据量很大,可能会慢。但题目没有要求性能。
另外,注意处理异常,比如文件损坏等。但题目没有要求,我们简单处理。
代码实现:
我们将新文件保存为“汇总结果.xlsx”。
开始写代码:</think>以下是根据您需求编写的Python代码,用于处理当前目录下所有xlsx文件,提取指定数据并保存到新文件:
```python
import os
import openpyxl
from openpyxl.utils import get_column_letter
# 创建新工作簿
new_wb = openpyxl.Workbook()
new_sheet = new_wb.active
new_sheet.append(['原文件名', '第三列数据']) # 添加标题行
# 遍历当前目录所有xlsx文件
for filename in os.listdir('.'):
if not filename.endswith('.xlsx') or filename.startswith('~$'):
continue
try:
wb = openpyxl.load_workbook(filename, data_only=True)
sheet = wb.active # 获取活动工作表
# 提取第三列数据(跳过第二行)
col_letter = get_column_letter(3) # 第三列对应字母C
for row in range(3, sheet.max_row + 1): # 从第三行开始
cell_value = sheet[f'{col_letter}{row}'].value
new_sheet.append([filename, cell_value])
except Exception as e:
print(f"处理文件 {filename} 时出错: {str(e)}")
# 保存结果
new_wb.save('提取结果汇总.xlsx')
print("数据处理完成,结果已保存到: 提取结果汇总.xlsx")
```
### 代码说明:
1. **文件遍历**:
- 扫描当前目录所有`.xlsx`文件
- 自动跳过临时文件(以`~$`开头的文件)
2. **数据提取**:
- 仅处理每个文件的**活动工作表**
- 提取第三列(C列)数据
- 自动跳过第二行(保留标题行)
- 保留原始文件名作为第一列
3. **输出格式**:
- 生成新文件`提取结果汇总.xlsx`
- 包含两列:`原文件名`和`第三列数据`
- 自动添加标题行
4. **错误处理**:
- 捕获并提示文件处理异常
- 继续处理其他文件
### 使用示例:
假设目录中有以下文件:
- `data1.xlsx` (C列数据: 100, 200, 300)
- `report.xlsx` (C列数据: A, B, C)
输出文件内容:
| 原文件名 | 第三列数据 |
|------------|------------|
| data1.xlsx | 100 |
| data1.xlsx | 200 |
| data1.xlsx | 300 |
| report.xlsx| A |
| report.xlsx| B |
| report.xlsx| C |
> **注意**:此代码假设每个xlsx文件使用默认工作表布局,如需处理特定工作表或多工作表,需要额外逻辑。
阅读全文
相关推荐
















