python处理excel
python提取多个不同文件夹内的excel中为某些标题的列到新的excel,如果列数已满到临近的空白列继续输出 好的,鱼油,让我们来解决这个问题吧!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
# 将选定的列附加到all_data
all_data = pd.concat(, axis=1)
# 确保不会“超载”:分割列为多份
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[:, 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 小助理,如未能正确解答您的问题,请继续追问。 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: No such file or directory: 'D' 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
# 将选定的列附加到all_data
all_data = pd.concat(, 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 // 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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-7-2 09:26
呦,这可真是遇到麻烦了!让我们来看下这个错误:`FileNotFoundError: No such file or directory`。这 ...
在文件中指定某一个excel进行处理 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
# 初始化一个空的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 小助理,如未能正确解答您的问题,请继续追问。 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('.').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)是能全部读取的 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.split('表外_') if '表外_' in parts else None
# 检查文件名是否符合“表外_*”模式,且“*”与文件夹名称一致
if prefix_parts and len(prefix_parts) > 1 and prefix_parts != 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 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]