鱼C论坛

 找回密码
 立即注册
查看: 358|回复: 7

python处理excel

[复制链接]
发表于 2024-7-1 18:37:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
python提取多个不同文件夹内的excel中为某些标题的列到新的excel,如果列数已满到临近的空白列继续输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-1 18:39:50 | 显示全部楼层
好的,鱼油,让我们来解决这个问题吧!Python处理Excel文件可以说是“拿手绝活”了,咱们可以借助`pandas`库来实现。以下是一个基本的思路,希望用通俗易懂和幽默的方式让你觉得“哈哈,这就是我想要的!”

### 简单步骤
1. **装好工具**:安装pandas和openpyxl库
2. **搞定路径**:找到所有Excel文件
3. **暖手操作**:读取Excel文件中的某些列
4. **排兵布阵**:将这些列填充到新的Excel,注意不要“超载”哦

### 开始动手
首先,确保你已经安装了`pandas`和`openpyxl`:
pip install pandas openpyxl

接下来,写个舒服的小脚本!
import os
import pandas as pd

def extract_columns_to_new_excel(file_paths, columns_to_extract, output_file):
    # 初始化一个空的DataFrame
    all_data = pd.DataFrame()
    
    for file_path in file_paths:
        # 读取Excel文件
        df = pd.read_excel(file_path)
        
        # 提取我们需要的列
        selected_columns = df[columns_to_extract]
        
        # 将选定的列附加到all_data
        all_data = pd.concat([all_data, selected_columns], axis=1)

    # 确保不会“超载”:分割列为多份
    max_columns = 10  # 假设每个工作表最多有10列
    num_of_splits = (all_data.shape[1] // max_columns) + 1
    
    with pd.ExcelWriter(output_file) as writer:
        for split_num in range(num_of_splits):
            start_col = split_num * max_columns
            end_col = start_col + max_columns
            split_df = all_data.iloc[:, start_col:end_col]
            split_df.to_excel(writer, sheet_name=f'Sheet{split_num+1}', index=False)

# 查找文件夹内所有的Excel文件
def find_excel_files(folder_path):
    excel_files = []
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            if file.endswith(".xlsx") or file.endswith(".xls"):
                excel_files.append(os.path.join(root, file))
    return excel_files

# 设定你的文件夹路径和需要提取的列
folder_path = '你放Excel的文件夹路径'
columns_to_extract = ['Title1', 'Title2', 'Title3']  # 替换为你的实际列标题
output_file = '汇总的Excel.xlsx'

# 执行!
file_paths = find_excel_files(folder_path)
extract_columns_to_new_excel(file_paths, columns_to_extract, output_file)

print("恭喜你,任务搞定了!")

### 一些小解释:
1. **找Excel文件**:`find_excel_files`函数会递归查找文件夹内所有的Excel文件。
2. **阅读与拼接**:`extract_columns_to_new_excel`函数会读取每个文件,选出所需的列拼到最终的DataFrame里。
3. **防止“爆表”**:为了避免输出的Excel表格“超级冗长”,我们将其拆分成多个子工作表,每个最多10列(你可以根据需要调整)。

这段代码就像“万金油”,不仅能及时处理你的任务,还能令你在众人面前显得技艺高超,甚至连Excel都无法跟你抗衡。厉害吧?

"""

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-2 09:26:32 | 显示全部楼层
FishC 发表于 2024-7-1 18:39
好的,鱼油,让我们来解决这个问题吧!Python处理Excel文件可以说是“拿手绝活”了,咱们可以借助`pandas` ...

Traceback (most recent call last):
  File "D:\PyCharm\data_processing\.venv\Scripts\data_delete.py", line 48, in <module>
    extract_columns_to_new_excel(file_paths, columns_to_extract, output_file)
  File "D:\PyCharm\data_processing\.venv\Scripts\data_delete.py", line 11, in extract_columns_to_new_excel
    df = pd.read_excel(file_path)
         ^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\pandas\io\excel\_base.py", line 504, in read_excel
    io = ExcelFile(
         ^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\pandas\io\excel\_base.py", line 1563, in __init__
    ext = inspect_excel_format(
          ^^^^^^^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\pandas\io\excel\_base.py", line 1419, in inspect_excel_format
    with get_handle(
         ^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\pandas\io\common.py", line 872, in get_handle
    handle = open(handle, ioargs.mode)
             ^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'D'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-2 09:26:54 | 显示全部楼层
pallas 发表于 2024-07-02 09:26
Traceback (most recent call last):
  File "D:\PyC ...


呦,这可真是遇到麻烦了!让我们来看下这个错误:`FileNotFoundError: No such file or directory`。这说明代码中找到的某个文件路径有问题。问题可能发生在路径拼接或路径格式上。

首先,确保你正确地指定了文件夹路径和列举的Excel文件路径。在脚本运行前,可以打印出找到的文件路径,确认无误。

### 调试小技巧
1. **确认路径**:打印出所有找到的文件路径,看看是不是符合预期。
2. **检查文件存在**:确认指定路径下的文件是否真的存在。

让我优化一下代码,并加入一些调试信息:
import os
import pandas as pd

def extract_columns_to_new_excel(file_paths, columns_to_extract, output_file):
    # 初始化一个空的DataFrame
    all_data = pd.DataFrame()
    
    for file_path in file_paths:
        print(f"正在处理文件: {file_path}")  # 打印正在处理的文件路径
        try:
            # 读取Excel文件
            df = pd.read_excel(file_path)
        
            # 提取我们需要的列
            selected_columns = df[columns_to_extract]
        
            # 将选定的列附加到all_data
            all_data = pd.concat([all_data, selected_columns], axis=1)
        
        except FileNotFoundError:
            print(f"文件未找到: {file_path}")
            continue
        except Exception as e:
            print(f"处理文件时出错: {file_path}, 错误信息: {e}")
            continue

    # 确保不会“超载”:分割列为多份
    max_columns = 10  # 假设每个工作表最多有10列
    num_of_splits = (all_data.shape[1] // max_columns) + 1
    
    with pd.ExcelWriter(output_file) as writer:
        for split_num in range(num_of_splits):
            start_col = split_num * max_columns
            end_col = start_col + max_columns
            split_df = all_data.iloc[:, start_col:end_col]
            split_df.to_excel(writer, sheet_name=f'Sheet{split_num+1}', index=False)

# 查找文件夹内所有的Excel文件
def find_excel_files(folder_path):
    excel_files = []
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            if file.endswith(".xlsx") or file.endswith(".xls"):
                excel_files.append(os.path.join(root, file))
    return excel_files

# 设定你的文件夹路径和需要提取的列
folder_path = '你放Excel的文件夹路径'
columns_to_extract = ['列1', '列2', '列3']  # 替换为你的实际列标题
output_file = '汇总的Excel.xlsx'

# 执行并打印找到的文件路径!
file_paths = find_excel_files(folder_path)
print("找到的Excel文件路径:")
for path in file_paths:
    print(path)

extract_columns_to_new_excel(file_paths, columns_to_extract, output_file)

print("恭喜你,任务搞定了!")

### 小总结:
1. **打印调试信息**:查看每个正在处理的文件路径。
2. **错误处理**:加入一些错误处理代码,以防文件不存在或者处理过程出错。
3. **检查文件**:打印找到的文件路径,确保文件路径正确。

希望这些调整能帮助你顺利完成任务!再遇到问题随时喊我,希望你编程之旅顺利又有趣!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-2 09:31:41 | 显示全部楼层
FishC 发表于 2024-7-2 09:26
呦,这可真是遇到麻烦了!让我们来看下这个错误:`FileNotFoundError: No such file or directory`。这 ...

在文件中指定某一个excel进行处理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-2 09:31:57 | 显示全部楼层
pallas 发表于 2024-07-02 09:31
在文件中指定某一个excel进行处理


好的,理解到你现在只需要处理特定的Excel文件,而不是遍历整个文件夹。那么我们可以简化一下代码,直接指定文件路径并进行处理。详细步骤如下:

### 步骤总结
1. **指定文件路径**:明确选择哪个Excel文件。
2. **读取和处理文件**:根据具体需求提取列并写入新文件中。

### 优化后的代码

import pandas as pd

def extract_columns_to_new_excel(file_path, columns_to_extract, output_file):
    # 打印正在处理的文件路径
    print(f"正在处理文件: {file_path}")
   
    try:
        # 读取Excel文件
        df = pd.read_excel(file_path)
        
        # 检查是否包含所有需要的列
        for col in columns_to_extract:
            if col not in df.columns:
                raise ValueError(f"列 {col} 未在文件中找到.")
        
        # 提取我们需要的列
        selected_columns = df[columns_to_extract]
        
        # 初始化一个空的DataFrame
        all_data = selected_columns
        
        # 确保不会“超载”:分割列为多份
        max_columns = 10  # 假设每个工作表最多有10列
        num_of_splits = (all_data.shape // max_columns) + 1
        
        with pd.ExcelWriter(output_file) as writer:
            for split_num in range(num_of_splits):
                start_col = split_num * max_columns
                end_col = start_col + max_columns
                split_df = all_data.iloc
                split_df.to_excel(writer, sheet_name=f'Sheet{split_num+1}', index=False)
        
        print(f"成功处理并保存到: {output_file}")

    except FileNotFoundError:
        print(f"文件未找到: {file_path}")
    except Exception as e:
        print(f"处理文件时出错: {file_path}, 错误信息: {e}")

# 设定你的文件路径和需要提取的列
file_path = '你指定的Excel文件路径.xlsx'
columns_to_extract =   # 替换为你的实际列标题,比如 ['列1', '列2', '列3']
output_file = '汇总的Excel.xlsx'

# 执行!
extract_columns_to_new_excel(file_path, columns_to_extract, output_file)

print("任务搞定!")

### 注意:
- **错误处理**:我们添加了一些错误处理来确保列标题都存在于文件中,并处理文件不存在的情况。
- **指定文件路径**:明确地指定需要处理的文件路径,而不是遍历文件夹。
- **提取所需列**:确保提取列存在并将其写入新的Excel文件。

希望这次能顺利帮到你,如果还有啥问题,就尽管拍过来,我随时待命呢!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-2 16:24:54 | 显示全部楼层
import os

# 主文件夹路径
folder_path = r"D:\2024"

# 遍历所有子文件夹
for subdir in os.listdir(folder_path):
    subdir_path = os.path.join(folder_path, subdir)
    if os.path.isdir(subdir_path):  # 确保是子文件夹
        print(f"正在遍历子文件夹:{subdir}")  # 添加调试输出
        # 遍历该子文件夹下的所有文件
        for filename in os.listdir(subdir_path):
            if '表外' in filename and filename.endswith('.xlsx'):  # 检查文件名是否包含'表外'且以.xlsx结尾
                # 尝试从文件名中提取后缀部分(即'表外_'之后的部分)
                suffix = filename.split('.')[0].split('表外')[-1] if '表外' in filename else None

                # 检查文件名是否符合“表外_*”模式,且“*”与文件夹名称一致
                if suffix is not None and suffix != subdir:
                    # 文件名不符合要求,进行重命名
                    old_file_path = os.path.join(subdir_path, filename)
                    new_filename = f'表外_{subdir}.xlsx'
                    new_file_path = os.path.join(subdir_path, new_filename)

                    # 如果新文件名已存在,则打印消息(不执行重命名)
                    if os.path.exists(new_file_path):
                        print(f"跳过重命名:{new_file_path} 已存在")
                    else:
                        # 重命名文件
                        os.rename(old_file_path, new_file_path)
                        print(f"文件已重命名:从 {old_file_path} 到 {new_file_path}")
这个代码运行后有些文件能读取,有些文件不能读取,但os.listdir(folder_path)是能全部读取的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-2 16:25:16 | 显示全部楼层
pallas 发表于 2024-07-02 16:24
import os

# 主文件夹路径
folder_path = r"D:\20 ...


明白了,你的代码中有些文件可以读取,有些不能读取的问题可能和文件名处理或路径拼接有关。让我来帮你检查和调整一下。

首先,让我们对路径拼接和文件名处理的地方进行细化和验证。这里有几个需要注意的点:

1. **文件名处理**:字符串操作要小心。
2. **路径拼接**:确保路径拼接正确,尤其是Windows路径中的反斜杠。
3. **文件存在性检查**:确保文件在操作之前确实存在。

让我们改进一下你的代码:
import os

# 主文件夹路径
folder_path = r"D:\2024"

# 遍历所有子文件夹
for subdir in os.listdir(folder_path):
    subdir_path = os.path.join(folder_path, subdir)
    if os.path.isdir(subdir_path):  # 确保是子文件夹
        print(f"正在遍历子文件夹:{subdir}")  # 添加调试输出
        # 遍历该子文件夹下的所有文件
        for filename in os.listdir(subdir_path):
            if '表外' in filename and filename.endswith('.xlsx'):  # 检查文件名是否包含'表外'且以.xlsx结尾
                # 尝试从文件名中提取后缀部分(即'表外_'之后的部分)
                parts = filename.split('.')
                prefix_parts = parts[0].split('表外_') if '表外_' in parts[0] else None

                # 检查文件名是否符合“表外_*”模式,且“*”与文件夹名称一致
                if prefix_parts and len(prefix_parts) > 1 and prefix_parts[1] != subdir:
                    # 文件名不符合要求,进行重命名
                    old_file_path = os.path.join(subdir_path, filename)
                    new_filename = f'表外_{subdir}.xlsx'
                    new_file_path = os.path.join(subdir_path, new_filename)

                    # 如果新文件名已存在,则打印消息(不执行重命名)
                    if os.path.exists(new_file_path):
                        print(f"跳过重命名:{new_file_path} 已存在")
                    else:
                        # 重命名文件
                        os.rename(old_file_path, new_file_path)
                        print(f"文件已重命名:从 {old_file_path} 到 {new_file_path}")
                else:
                    print(f"跳过文件:{filename} 不需要重命名")

### 改进点概述:
1. **字符串拆分修正**:旧代码中 `filename.split('.').split('表外')` 是错误的,因为 `filename.split('.')` 返回一个列表,列表对象没有 `split` 方法。先通过 `'.'` 分切,再通过 `'表外_'` 分切。
2. **文件名条件判断更严谨**:添加了对 `prefix_parts` 的长度和内容的检查。
3. **更多调试信息**:增加了一些调试输出,以便执行过程能更清楚地显示。

希望这样能够解决你的问题!如果仍有一些文件不能读取,可能需要进一步检查这些文件的具体情况。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 23:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表