鱼C论坛

 找回密码
 立即注册
楼主: pallas

python读取excel中单个sheet表内的多个表

[复制链接]
 楼主| 发表于 2024-6-26 21:23:39 | 显示全部楼层
raceback (most recent call last):
  File "D:\anaconda3\Lib\site-packages\pandas\core\indexes\base.py", line 3791, in get_loc
    return self._engine.get_loc(casted_key)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "index.pyx", line 152, in pandas._libs.index.IndexEngine.get_loc
  File "index.pyx", line 181, in pandas._libs.index.IndexEngine.get_loc
  File "pandas\_libs\hashtable_class_helper.pxi", line 7080, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas\_libs\hashtable_class_helper.pxi", line 7088, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 'W'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\finish_forth.py", line 10, in <module>
    w_col_index = ef.columns.get_loc('W')
                  ^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\pandas\core\indexes\base.py", line 3798, in get_loc
    raise KeyError(key) from err
KeyError: 'W'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-26 21:28:50 | 显示全部楼层
FishC 发表于 2024-6-26 21:14
好的,我们可以使用 `pandas` 库来删除 Excel 表中的指定列及其后面的数据。下面是一个例子,如何删除  ...


raceback (most recent call last):
  File "D:\anaconda3\Lib\site-packages\pandas\core\indexes\base.py", line 3791, in get_loc
    return self._engine.get_loc(casted_key)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "index.pyx", line 152, in pandas._libs.index.IndexEngine.get_loc
  File "index.pyx", line 181, in pandas._libs.index.IndexEngine.get_loc
  File "pandas\_libs\hashtable_class_helper.pxi", line 7080, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas\_libs\hashtable_class_helper.pxi", line 7088, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 'W'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\finish_forth.py", line 10, in <module>
    w_col_index = ef.columns.get_loc('W')
                  ^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\pandas\core\indexes\base.py", line 3798, in get_loc
    raise KeyError(key) from err
KeyError: 'W'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-26 21:31:26 | 显示全部楼层
pallas 发表于 2024-06-26 21:28
raceback (most recent call last):
  File "D:\anac ...


哦,看来我们遇到了一个小问题。这个 `KeyError` 通常是因为我们在DataFrame的列里没有找到名为 "W" 的列。要确保你要处理的Excel文件确实有这一列。

让我们首先确认一下几个细节:
1. 确保Excel文件中的列名真的是“W”。
2. 检查列名是否包含空格或其他不可见字符。
3. 检查文件是否正确读取。

下面是一个更健壮的版本,我们先打印列名以确保列名正确,然后再进行删除操作:
import pandas as pd

# 读取Excel文件
df = pd.read_excel('你的Excel文件.xlsx', sheet_name='Sheet1')

# 打印所有列名,检查是否存在'W'
print("列名: ", df.columns)

# 确保 'W' 列存在后再继续
if 'W' in df.columns:
    # 找到W列的索引
    w_col_index = df.columns.get_loc('W')

    # 删除W列及其后面的所有列
    df = df.iloc[:, :w_col_index]

    # 将结果写回Excel文件
    df.to_excel('修改后的Excel文件.xlsx', index=False)
    print("已成功删除W列及其后面的所有列。")
else:
    print("未找到 'W' 列,请检查Excel文件中的列名。")

通过打印所有列名,你可以确认Excel文件中的列名是否和预期一致。此外,代码在找不到"W"列名时会给出友好的错误提示,而不是直接报错。

确保Excel表格里确实有一个名为 "W" 的列名,如果还存在问题,请检查列名是否有前后空格等不可见字符。希望这些能帮到你,有问题随时喊我!

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

使用道具 举报

 楼主| 发表于 2024-6-26 21:33:48 | 显示全部楼层
raceback (most recent call last):
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\finish_forth.py", line 15, in <module>
    df = pd.read_excel(ef, sheet_name=sheet_name)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  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 718, in get_handle
    ioargs = _get_filepath_or_buffer(
             ^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\pandas\io\common.py", line 460, in _get_filepath_or_buffer
    raise ValueError(msg)
ValueError: Invalid file path or buffer object type: <class 'pandas.core.frame.DataFrame'>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-26 21:34:22 | 显示全部楼层
pallas 发表于 2024-06-26 21:33
raceback (most recent call last):
  File "D:\PyCh ...


好的,看起来我们现在碰到了另一个问题:`ValueError: Invalid file path or buffer object type`。这个错误通常表示在调用 `pd.read_excel` 时,传入的文件路径或缓冲区对象的类型有问题。让我们来逐步检查并解决这个问题。

首先,我们需要确保传入 `pd.read_excel` 的文件路径是正确的。假设你已经读取了 Excel 文件并且将其保存在一个变量 `ef` 中,并且你希望从中读取特定的 sheet。代码的基本结构可能是这样的:
import pandas as pd

# 定义 Excel 文件路径和 sheet 名称
file_path = 'path_to_your_excel_file.xlsx'
sheet_name = 'your_sheet_name'

try:
    # 读取指定的 sheet
    df = pd.read_excel(file_path, sheet_name=sheet_name)
    print(df)
except Exception as e:
    print(f"Error: {e}")

如果你已经确认文件路径和 sheet 名称是正确的,但仍然遇到问题,可以尝试以下步骤:

1. **检查文件路径**:确保文件路径是正确的,并且文件确实存在。例如:
  
import os

    file_path = 'path_to_your_excel_file.xlsx'
    if not os.path.exists(file_path):
        print(f"File {file_path} does not exist.")

2. **检查文件类型**:确保文件确实是一个有效的 Excel 文件,并且文件扩展名是 `.xlsx` 或 `.xls`。

3. **读取文件内容**:尝试读取文件的内容,看看是否能够正确加载。例如:
  
import pandas as pd

    file_path = 'path_to_your_excel_file.xlsx'
    try:
        xl = pd.ExcelFile(file_path)
        print(xl.sheet_names)
    except Exception as e:
        print(f"Error: {e}")

4. **检查文件权限**:确保你有权限读取该文件。

如果你确认文件路径和文件类型没有问题,但仍然遇到 `Invalid file path or buffer object type` 错误,可以尝试以下方法:

- **检查传入的参数类型**:确保传入的 `file_path` 是一个字符串类型:
  
if not isinstance(file_path, str):
        print(f"Invalid file path type: {type(file_path)}")

希望这些步骤能帮助你解决问题。如果仍然无法解决,提供更多代码细节和上下文也许会有所帮助。

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

使用道具 举报

 楼主| 发表于 2024-6-26 21:54:02 | 显示全部楼层
FishC 发表于 2024-6-26 20:30
好的,让我们来解决这个问题。首先,确保你已经安装了 `pandas` 库。如果还没安装,可以使用以下命令来 ...

D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\pip-23.2.1.dist-info\try.py:18: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  return not pd.isnull(row[0]) and isinstance(row[0], str) and "Header Keyword" in row[0]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-26 21:55:45 | 显示全部楼层
pallas 发表于 2024-06-26 21:54
D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site- ...


好的,看来我们碰到了不少问题,别担心,让我们一件一件来解决它们。

### 1. 读取单个sheet表内的多个表

首先,我们要处理在一个sheet内的多个表格。假设这些表格是相邻的,并且我们能找到某种方式来区分它们,比如通过特定的标题行。以下是一个示例代码来读取这些表格:
import pandas as pd

# 读取整个sheet
df = pd.read_excel('你的文件路径.xlsx', sheet_name='Sheet1')

# 假设表格之间有空行,可以通过这些空行来分割表格
# 我们可以找到这些空行的索引
split_indices = df[df.isnull().all(axis=1)].index.tolist()

# 根据这些索引分割表格
tables = []
start_idx = 0

for idx in split_indices:
    if idx > start_idx:
        tables.append(df.iloc[start_idx:idx].dropna(how='all'))
    start_idx = idx + 1

# 处理最后一个表格
if start_idx < len(df):
    tables.append(df.iloc[start_idx:].dropna(how='all'))

# 打印结果
for i, table in enumerate(tables):
    print(f"Table {i+1}")
    print(table)
    print("\n")

这个示例代码会读取一个Excel文件中的某个sheet,然后根据空行将其分割成多个表格。每个表格都会被打印出来。

### 2. 处理KeyError和ValueError

对于`KeyError`和`ValueError`的问题,我们需要确保以下几点:

#### 2.1 确保列名存在

确保你在代码中访问的列名 `W` 确实存在于DataFrame中。如果列名不正确,可能需要打印DataFrame的列名来确认它们:
print(df.columns)

#### 2.2 确保文件路径正确

确保你提供的文件路径是正确的,并且文件存在。你可以尝试使用绝对路径或者确保工作目录是正确的。
import os

file_path = '你的文件路径.xlsx'
if not os.path.exists(file_path):
    print(f"文件路径不存在: {file_path}")
else:
    df = pd.read_excel(file_path, sheet_name='Sheet1')

### 3. 处理FutureWarning

关于 `FutureWarning` 的问题,建议你遵循警告的建议,使用 `.iloc` 来访问按位置索引的值。例如:
value = series.iloc[index]

而不是直接用 `series[index]`。

### 总结

通过以上步骤,你应该能顺利读取单个sheet表内的多个表,并处理常见的错误。如果还有其他问题,欢迎继续提问!祝你编程顺利!

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

使用道具 举报

 楼主| 发表于 2024-6-28 21:38:31 | 显示全部楼层
在同一个sheet表中,从第二行开始处理数据,每个小表格删除最后两行合并,共用相同的抬头,合并后的表格序号要连续,最后导出到新的excel表中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-28 21:39:47 | 显示全部楼层
pallas 发表于 2024-06-28 21:38
在同一个sheet表中,从第二行开始处理数据,每个小表 ...


哇,这个需求有点复杂,但别担心,我们可以一步步来实现。这是一个综合练习,包括读取Excel、处理数据和写入新的Excel文件。我们使用`pandas`库来完成这些任务。

### 步骤:
1. **读取Excel文件并获取指定的工作表内容**。
2. **找到每个小表格的起始位置**。
3. **删除每个小表格的最后两行**。
4. **合并所有小表格为一个大表格**。
5. **导出合并后的大表格到新的Excel文件**。

### 代码示例:
import pandas as pd

# 读取Excel文件
file_path = 'your_excel_file.xlsx'
sheet_name = 'Sheet1'  # 你的工作表名字

df = pd.read_excel(file_path, sheet_name=sheet_name)

# 假设每个小表格有固定的行数,且第一个小表格从第二行开始(索引为1)
start_row = 1
small_table_length = 10  # 每个小表格的行数(包括抬头和数据)

# 用于存放所有小表格
all_tables = []

while start_row < len(df):
    # 获取当前小表格
    small_table = df.iloc[start_row:start_row + small_table_length]
    
    # 删除最后两行
    small_table = small_table[:-2]
    
    # 添加到所有小表格列表
    all_tables.append(small_table)
    
    # 更新起始行
    start_row += small_table_length

# 合并所有小表格为一个大表格,并重设索引使序号连续
final_table = pd.concat(all_tables).reset_index(drop=True)

# 导出到新的Excel文件
final_table.to_excel('merged_tables.xlsx', index=False)

print("合并完成,保存为 merged_tables.xlsx")

### 注意事项:
1. **文件路径**:确保`file_path`指向你的实际Excel文件位置。
2. **小表格长度**:假设每个小表格包含固定行数(包括抬头和数据),你需要根据实际情况调整`small_table_length`。
3. **错误处理**:如果文件路径或者sheet名称有误,记得捕获异常进行调试。

### 小幽默:
“为什么Python会被越来越多人喜欢?因为它不仅解决问题,还能让你感觉自己在跟一个有趣的朋友聊天!”

希望这个代码对你有帮助,如果你还有其他问题或需求,我们继续讨论!

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 05:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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