鱼C论坛

 找回密码
 立即注册
查看: 1484|回复: 128

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

[复制链接]
发表于 2024-6-22 03:51:24 | 显示全部楼层 |阅读模式

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

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

x
是单个sheet表内的多个表,不是一个excel表中的多个sheet表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-22 03:51:35 | 显示全部楼层
哈哈,这个问题有点意思,感觉像是要在一个超大的披萨上找出好几块不同口味的披萨片。OK,我们开始吧!

其实呢,一个Excel sheet就像一个二维平面表格,你说的多个表,很可能是指在同一个sheet里面,有几块分开的数据区域。这种情况,你得先定位到这些独立的数据块,然后分别读取它们。

假设你已经知道这些表的位置和规模,那么最简单的办法是用pandas库来处理。我们可以利用pandas读取整个sheet,然后再根据索引去切片。

下面是一个简单的示例:
import pandas as pd

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

# 假设第一个表在A1:C5, 第二个表在A10:C15
table1 = df.iloc[0:5, 0:3]  # 行 0 到 4 (包头不包尾), 列 0 到 2 (包头不包尾)
table2 = df.iloc[9:15, 0:3]  # 行 9 到 14, 列 0 到 2

print("第一个表:")
print(table1)

print("\n第二个表:")
print(table2)

这个方法的核心就是`.iloc`,它允许你通过行和列的索引(位置)进行切片操作。当然了,你需要知道这些表格具体在哪些行列。

### 如果位置不确定?

假如你不确定这些子表的位置,那么事情会稍微复杂一点。你可能需要一些规则或者模式来找出这些子表,例如:
- 每个子表之间有一定数量的空行。
- 每个子表都有相似的列名结构。

这里我们可以写个函数来检测这些特征:
def detect_tables(df):
    tables = []
    start_row = None

    for i in range(len(df)):
        if not df.iloc[i].isnull().all():  # 当前行不为空
            if start_row is None:
                start_row = i
        else:  # 当前行为空
            if start_row is not None:
                tables.append(df.iloc[start_row:i])
                start_row = None
    
    # 添加最后一个表
    if start_row is not None:
        tables.append(df.iloc[start_row:])

    return tables

# 使用函数检测表
tables = detect_tables(df)

for index, table in enumerate(tables):
    print(f"\n第{index + 1}个表:")
    print(table)

这个函数巧妙地利用了空行来检测表的边界。当然,如果表格之间没有明确的空行分隔或者有其他更加复杂的情况,还需要进一步定制逻辑。

那就这样啦,看起来简单,其实有各种细节可以挖掘,有兴趣的话可以进一步探讨!

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

使用道具 举报

 楼主| 发表于 2024-6-22 10:09:30 | 显示全部楼层
那如果是要按这样的形式分离表格呢?
大概是这样的,表格之间 是有文字
微信图片_20240622100817.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 10:09:45 | 显示全部楼层
pallas 发表于 2024-06-22 10:09
那如果是要按这样的形式分离表格呢?
大概是这样的, ...


明白了,兄弟。你遇到的情况就像在一本厚厚的书里寻找独立的章节,而每个章节之间都有一些明显的标题或者隔离文字。

我们可以利用这些“隔离文字”来分割表格。在这种情况下,我们需要先读取整个Sheet,然后通过遍历寻找那些特定的文字行,以此来分割表格。

我们可以这样做:

1. 读取整个Sheet数据。
2. 遍历行,找出那些包含隔离文字的行。
3. 根据这些行的位置,将原始数据切分成多个子表。

假设我们把那些隔离文字叫做“separator”。

下面是具体代码:
import pandas as pd

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

# 假设隔离文字在第1列(index 0)
separator = "隔离文字"

# 功能:查找包含某文字的行索引
separator_rows = [index for index, row in df.iterrows() if row[0] == separator]

# 将整个数据集切分成子表
tables = []
start_row = 0

for end_row in separator_rows:
    if start_row < end_row:
        tables.append(df.iloc[start_row:end_row])
    start_row = end_row + 1

# 添加最后一部分,如果它不为空
if start_row < len(df):
    tables.append(df.iloc[start_row:])

# 显示每个子表
for i, table in enumerate(tables):
    print(f"\n第{i + 1}个表:")
    print(table)

运行这段代码,你会得到分割后的子表。这些子表将以DataFrame的形式存储在`tables`列表中。

### 贴心小提示:
1. **灵活性**:如果“隔离文字”不仅仅在第一列,你可以调整 `row[0]` 的位置,以适应你的具体情况。
2. **预处理**:如果“隔离文字”有多种形式,例如不同的语义,你可能需要在查找时增加一些字符串匹配的逻辑,比如 `if separator in str(row[0])`。
3. **后处理**:这个方法读取的是原始数据,没有清除掉“隔离文字”行,如果不需要这些行,可以在分割后再进行处理。

这样,通过灵活运用Python和pandas,我们可以方便地处理多块数据表的复杂情况。不用费劲去手动拆分Excel文件啦,瞬间感觉效率提高了不是一点点!

是不是很简单?快去试试吧!有问题再来找我,没关系,我保证比隔壁老王还耐心 :D

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

使用道具 举报

发表于 2024-6-22 10:12:03 | 显示全部楼层
只要有点常识的人  都不会这样设计表格
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-22 10:40:05 | 显示全部楼层
FishC 发表于 2024-6-22 10:09
明白了,兄弟。你遇到的情况就像在一本厚厚的书里寻找独立的章节,而每个章节之间都有一些明显的标题或 ...

那如果我想separators中有多个数据,然后根据separators中的数据进行分割呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 10:44:11 | 显示全部楼层
pallas 发表于 2024-06-22 10:40
那如果我想separators中有多个数据,然后根据separato ...


好的,这下任务升级啦!我们需要根据多个“隔离文字”进行分割。就像要同时识别出书本中的不同声音标识,找到每个章节的开头。

非常直观,只需在判断行是否是分隔符的时候,改成判断行是否在多个分隔符集合中。这样可以灵活处理多个分隔符。

具体步骤还是类似的:

1. 读取整个Sheet数据。
2. 遍历行,找出那些包含任意一个分隔符的行。
3. 根据这些行的位置切分表格。

下面是具体代码:
import pandas as pd

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

# 假设多个隔离文字在第1列(index 0)
separators = ["隔离文字1", "隔离文字2", "隔离文字3"]

# 找到所有包含任意一个分隔符的行索引
separator_rows = [index for index, row in df.iterrows() if row in separators]

# 将整个数据集切分成子表
tables = []
start_row = 0

for end_row in separator_rows:
    if start_row < end_row:
        tables.append(df.iloc[start_row:end_row])
    start_row = end_row + 1

# 添加最后一部分,如果它不为空
if start_row < len(df):
    tables.append(df.iloc[start_row:])

# 显示每个子表
for i, table in enumerate(tables):
    print(f"\n第{i + 1}个表:")
    print(table)

### 解释一下代码:

1. **读取Excel表格**:使用`pandas`读入整个sheet内容。
2. **寻找分隔符行**:利用`iterrows()`遍历每一行,判断第一列内容是否在`separators`列表中。如果是,就记录下这个行索引。
3. **分割表格**:使用这些行索引,将原始数据划分成若干个子表,并存储在`tables`列表中。
4. **显示结果**:遍历`tables`,逐个打印子表内容。

### 灵活性:
1. **多列分隔符判断**:如果分隔符不在第1列,你可以调整`row[0]`为相应的列索引,比如`row[1]`,`row[2]`等。
2. **忽略空列或其他特定情况**:如果有复杂的排除逻辑,还可以在判断条件中增加进一步的规则。

这样,即便有多个分隔符,我们也能方便地处理,Python自然是帮大忙的了!有了这个灵活的方法,再来多少个分隔符都不怕,手指轻松一点,代码一键搞定!

赶紧试着用吧,觉得好用的话记得给我点赞哦~ 有什么问题随时找我,我保证比你家的WiFi信号还稳定 :D

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

使用道具 举报

 楼主| 发表于 2024-6-22 10:59:14 | 显示全部楼层
运行后他显示:
Traceback (most recent call last):
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\extract.py", line 33, in <module>
    separator_rows = [index for index, row in df.iterrows() if row in separators]
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\extract.py", line 33, in <listcomp>
    separator_rows = [index for index, row in df.iterrows() if row in separators]
                                                               ^^^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\pandas\core\generic.py", line 1519, in __nonzero__
    raise ValueError(
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 11:00:32 | 显示全部楼层
pallas 发表于 2024-06-22 10:59
运行后他显示:
Traceback (most recent call last): ...


好的,遇到这个错误的原因是`pandas`在进行布尔判断时需要明确地指定条件。我们在生成分隔符行索引时,需要对每一行的特定列进行判断,不能直接使用布尔值进行列表推导。

让我们针对这个问题进行修正,并以明确的方法寻找包含任何一个分隔符的行。

下面是改进后的代码:
import pandas as pd

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

# 假设多个隔离文字在第1列(index 0)
separators = ["separator1", "separator2", "separator3"]

# 找到所有包含任意一个分隔符的行索引
separator_rows = [index for index, row in df.iterrows() if row[0] in separators]

# 将整个数据集切分成子表
tables = []
start_row = 0

for end_row in separator_rows:
    if start_row < end_row:
        tables.append(df.iloc[start_row:end_row])
    start_row = end_row + 1

# 添加最后一部分,如果它不为空
if start_row < len(df):
    tables.append(df.iloc[start_row:len(df)])

# 显示每个子表
for i, table in enumerate(tables):
    print(f"\n第{i + 1}个表:")
    print(table)

### 解释一下改进的代码:
1. **读取Excel表格**:使用`pandas`读入整个sheet内容。
2. **寻找分隔符行**:利用`iterrows()`遍历每一行,判断第一列内容是否在`separators`列表中。如果是,就记录下这个行索引。
3. **分割表格**:使用这些行索引,将原始数据划分成若干个子表,并存储在`tables`列表中。
4. **显示结果**:遍历`tables`,逐个打印子表内容。

通过这种方法,你可以灵活地处理任意数量的分隔符,不再会遇到布尔判断错误的问题。

### 再次说明:
- **多列分隔符判断**:如果分隔符不在第1列,你可以调整`row[0]`为相应的列索引,比如`row[1]`,`row[2]`等。
- **忽略空列或其他特定情况**:如果有复杂的排除逻辑,还可以在判断条件中增加进一步的规则。

希望这次的改进能顺利解决你的问题!赶紧试试,有问题随时来找我,我保证比哈里波特的魔法还管用 :D

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

使用道具 举报

 楼主| 发表于 2024-6-22 11:01:03 | 显示全部楼层
pallas 发表于 2024-6-22 10:59
运行后他显示:
Traceback (most recent call last):
  File "D:\PyCharm\excel_merge\excel_merge\.venv ...

解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 11:05:16 | 显示全部楼层


太好了!听到你解决了问题我也替你高兴!看来我们的代码魔法确实生效了。如果有其他任何问题或是新的挑战,随时欢迎来找我,就像哈利波特遇到困难时会去找邓布利多一样可靠。

另外,如果你对数据处理还有其他需求,比如数据清洗、可视化或者其他分析任务,也可以尽管提问。Python可是我们用起来得心应手的工具箱哦!

祝你编码愉快,工作顺利!如果再需要帮忙,记得呼叫我哦 :D

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

使用道具 举报

 楼主| 发表于 2024-6-22 11:09:02 | 显示全部楼层
FishC 发表于 2024-6-22 11:00
好的,遇到这个错误的原因是`pandas`在进行布尔判断时需要明确地指定条件。我们在生成分隔符行索引时, ...

那我如果有多个excel表,但其里面的格式是相同的(同上),不同的只有表格中的数据,我现在要把他们统计在一个excel表中呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 11:09:22 | 显示全部楼层
pallas 发表于 2024-06-22 11:09
那我如果有多个excel表,但其里面的格式是相同的(同 ...


哇哦!又来了一个有趣的挑战,这次是要将多份相同格式的Excel文件合并成一个,简直像是在拼装一个超级豪华拼图,不同的只是每块拼图的内容~ 没问题,我们可以轻松搞定这件事!

### 思路

1. **读取每个Excel文件**:我们可以使用`glob`库来找到所有目标文件。
2. **分割每个文件中的子表**:使用和之前类似的方法找出分隔符并进行分割。
3. **合并所有子表**:将所有子表汇总到一个DataFrame中。
4. **写入新的Excel文件**:将合并后的数据写入一个新的Excel文件。

### 具体代码

首先,确保你已经安装了`pandas`和`openpyxl`(用于处理Excel文件)的库。如果没有,可以通过以下命令安装:
pip install pandas openpyxl

然后,下面是具体的实现代码:
import pandas as pd
import glob

# 文件路径模式(假设所有Excel文件都放在某个目录下)
excel_files_pattern = 'path_to_your_excel_files/*.xlsx'
separators =  # 你的分隔符列表

def get_tables_from_excel(file):
    df = pd.read_excel(file, sheet_name='Sheet1')
    separator_rows = [index for index, row in df.iterrows() if row in separators]

    tables = 
    start_row = 0

    for end_row in separator_rows:
        if start_row < end_row:
            tables.append(df.iloc)
        start_row = end_row + 1

    if start_row < len(df):
        tables.append(df.iloc)

    return tables

# 初始化一个空的DataFrame来存储所有的数据
all_tables = pd.DataFrame()

# 找到所有的Excel文件并处理它们
for file in glob.glob(excel_files_pattern):
    tables = get_tables_from_excel(file)
    for table in tables:
        all_tables = pd.concat([all_tables, table], ignore_index=True)

# 写入到一个新的Excel文件
output_file = 'path_to_your_output_file/merged.xlsx'
all_tables.to_excel(output_file, index=False)

print("所有表格已成功合并到一个Excel文件中!")

### 解释一下代码:

1. **读取Excel文件路径**:使用`glob.glob()`找到所有匹配路径模式的Excel文件。
2. **定义分割子表的函数**:`get_tables_from_excel()`函数根据之前的逻辑,从每个Excel文件中分割出子表。
3. **初始化空的DataFrame**:`all_tables`用来存储所有合并后的数据。
4. **遍历所有文件并处理**:对于每个文件,调用分割函数,然后将每个子表合并到`all_tables`中。
5. **导出合并后的数据**:使用`to_excel()`将最终结果输出到一个新的Excel文件中。

这样,你就能轻松地将多个Excel文件中的子表合并到一个新的文件中。省时省力,效率飙升!

赶紧试试吧,如果再有问题或者需要改进的地方,随时来找我吧,我的魔法永远为你而准备!:D

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

使用道具 举报

 楼主| 发表于 2024-6-22 11:16:22 | 显示全部楼层
FishC 发表于 2024-6-22 11:09
哇哦!又来了一个有趣的挑战,这次是要将多份相同格式的Excel文件合并成一个,简直像是在拼装一个超级 ...

运行报错:
Traceback (most recent call last):
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\extract.py", line 67, in <module>
    tables = get_tables_from_excel(file)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\extract.py", line 47, in get_tables_from_excel
    separator_rows = [index for index, row in df.iterrows() if row in separators]
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\extract.py", line 47, in <listcomp>
    separator_rows = [index for index, row in df.iterrows() if row in separators]
                                                               ^^^^^^^^^^^^^^^^^
  File "D:\anaconda3\Lib\site-packages\pandas\core\generic.py", line 1519, in __nonzero__
    raise ValueError(
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 11:17:33 | 显示全部楼层
pallas 发表于 2024-06-22 11:16
运行报错:
Traceback (most recent call last):
   ...


好的,咱们继续探讨这个有趣而略带“调皮”的错误。这个错误提示依然与布尔判断有关,`pandas`在判断条件时,需要我们明确指定该怎么处理布尔值。让我们仔细看看代码哪里出了问题。

### 重新调整代码

首先,我们需要确保在找到分隔行时,更清晰地做出布尔判断。然后将多个Excel文件中的数据合并到一个最终的DataFrame中。

你之前提到过分隔符,让我来做个补充然后改进一下:
import pandas as pd

# 定义函数从单个Excel文件(单个sheet表内的多个表)读取数据
def get_tables_from_excel(filename, sheet_name, separators):
    # 读取excel,返回的是 DataFrame
    df = pd.read_excel(filename, sheet_name=sheet_name)

    # 获取属于分隔行的索引
    separator_rows = df.loc[df.iloc[:, 0].isin(separators)].index.tolist()
    separator_rows.append(len(df)) # 加上最后一行索引,方便切片

    tables = []
    previous_sep = 0

    for sep in separator_rows:
        if previous_sep != sep: 
            table = df.iloc[previous_sep:sep].reset_index(drop=True)
            tables.append(table)
            
        previous_sep = sep + 1

    return tables

# 多个Excel文件路径
files = ["file1.xlsx", "file2.xlsx", "file3.xlsx"]

# 假设所有Excel文件中单sheet的名称相同
sheet_name = "Sheet1"

# 定义你的分隔符
separators = ['separator1', 'separator2']

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

# 逐个读取 Excel 文件并获取表格
for file in files:
    tables = get_tables_from_excel(file, sheet_name, separators)
    all_tables.extend(tables)

# 将所有表格写入一个新的Excel文件,每个表格作为一个新的Sheet
with pd.ExcelWriter('merged_output.xlsx') as writer:
    for idx, table in enumerate(all_tables):
        table.to_excel(writer, sheet_name=f'Table_{idx+1}', index=False)

print("合并完成!")

### 解释
1. 我们修正了`separator_rows`获取方法,通过`.loc[df.iloc[:, 0].isin(separators)]`来准确找到那些分隔行。
2. `separator_rows`列表末尾添加了一个元素,即`len(df)`,这样方便我们进行切片操作。
3. 遍历`separator_rows`时,确保每一块表格在分隔符之间被提取,并重置索引。
4. 最后,我们把所有提取到的表格保存在`all_tables`列表中,并导出到一个Excel文件中,每个表格作为一个新的sheet。

试试这个代码,看是否解决了你的问题。如果还有问题,请随时告诉我,我随时待命!

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

使用道具 举报

 楼主| 发表于 2024-6-22 11:30:21 | 显示全部楼层
FishC 发表于 2024-6-22 11:17
好的,咱们继续探讨这个有趣而略带“调皮”的错误。这个错误提示依然与布尔判断有关,`pandas`在判断条 ...

Traceback (most recent call last):
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\extract.py", line 75, in <module>
    tables = get_tables_from_excel(file, sheet_name, separators)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\PyCharm\excel_merge\excel_merge\.venv\Lib\site-packages\extract.py", line 28, in get_tables_from_excel
    df = pd.read_excel(filename, 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 872, in get_handle
    handle = open(handle, ioargs.mode)
             ^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: [Errno 22] Invalid argument: 'D:\x824年6月14日\x01.周-南(6月14日).xlsx'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 11:30:34 | 显示全部楼层
pallas 发表于 2024-06-22 11:30
Traceback (most recent call last):
  File "D:\PyC ...


明白了,这个错误看起来与文件路径有关。您的路径中包含了一些特殊字符,可能引起了问题。我们需要确保文件路径是正确的,并以正确的方式读取文件。

### 解决文件路径问题

这里有几点可以考虑:
1. 检查并修改文件路径,确保路径有效且不存在特殊字符。
2. 使用原始字符串(`r"..."`)来处理路径字符串,避免转义字符的问题。

### 调整后的代码
为了确保路径处理正确,建议将路径在使用之前进行检查和处理。下面是调整后的代码示例:
import pandas as pd
import glob

def get_tables_from_excel(filename, sheet_name, separators):
    # 使用原始字符串防止特殊字符带来的问题
    df = pd.read_excel(rf"{filename}", sheet_name=sheet_name)
    
    separator_rows = df.apply(lambda row: any(separator in str(row) for separator in separators), axis=1)
    start_idx = df.index[separator_rows].tolist()

    tables = []
    for i in range(len(start_idx)):
        start = start_idx[i] + 1
        end = start_idx[i + 1] if i + 1 < len(start_idx) else len(df)
        table = df.iloc[start:end]
        tables.append(table)

    return tables

def merge_excels(file_pattern, sheet_name, separators):
    all_tables = []

    files = glob.glob(file_pattern)
    for file in files:
        tables = get_tables_from_excel(file, sheet_name, separators)
        all_tables.extend(tables)

    merged_df = pd.concat(all_tables, ignore_index=True)
    return merged_df

# 你的文件模式,例如:"*.xlsx"
file_pattern = r"D:\your_folder\*.xlsx"
sheet_name = "Sheet1"  # 你的具体Sheet名称
separators = ["===", "---", "###"]  # 你的分隔符列表

merged_df = merge_excels(file_pattern, sheet_name, separators)

# 保存合并后的结果到一个新的Excel文件
merged_df.to_excel(r"D:\your_folder\merged_result.xlsx", index=False)

### 注意事项
1. 确保 `file_pattern` 是正确的文件搜索模式(例如:`*.xlsx`)。
2. `sheet_name` 应该用于所有文件中的相同 Sheet。
3. `separators` 可以根据实际情况调整为合适的分隔符。

希望这样能够顺利运行,如果还有其他问题或报错,请随时告诉我,咱们继续调试~!

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

使用道具 举报

 楼主| 发表于 2024-6-22 11:30:53 | 显示全部楼层
这个是对文件的命名有要求吗?
我先前也是这样命名的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-22 11:31:07 | 显示全部楼层
pallas 发表于 2024-06-22 11:30
这个是对文件的命名有要求吗?
我先前也是这样命名的


好的,那这个问题不太可能仅仅是命名问题,我们再来仔细看看路径问题。路径中使用特殊字符和文件名可能会引起读取问题,我们可以进行以下几个检查和修正:

1. **确保路径有效**:确认路径中没有错字或无效字符。
2. **使用原始字符串处理路径**:加上 `r` 前缀以避免转义字符带来的问题。
3. **确认文件存在**:确保文件路径正确且文件存在。

我们重新调整一下代码,确保路径是原始字符串类型,并进一步优化读取和合并的代码。

### 优化后的代码
import pandas as pd
import os

# 定义函数来从单个 Excel 文件中提取所有表格
def get_tables_from_excel(filename, sheet_name, separators):
    df = pd.read_excel(filename, sheet_name=sheet_name)
    separator_rows = df.apply(lambda row: any(item in str(row) for item in separators), axis=1)

    # 找到分隔行的索引
    separator_indices = [index for index, value in separator_rows.items() if value]
    separator_indices.append(len(df))  # 把最后一索引也加上

    tables = []
    start_idx = 0
    for end_idx in separator_indices:
        if start_idx < end_idx:
            tables.append(df.iloc[start_idx:end_idx])
        start_idx = end_idx + 1
        
    return tables

# 定义函数来合并所有表格
def merge_tables(file_list, sheet_name, separators):
    all_tables = []
    
    for file in file_list:
        file = r'{}'.format(file)  # 使用原始字符串避免转义问题
        if os.path.exists(file):  # 确认文件存在
            tables = get_tables_from_excel(file, sheet_name, separators)
            all_tables.extend(tables)
        else:
            print(f"文件未找到: {file}")

    # 合并所有表格
    combined_df = pd.concat(all_tables, ignore_index=True)
    return combined_df

# 示例文件列表和分隔符
excel_files = [
    r'D:\路径1\文件1.xlsx',
    r'D:\路径2\文件2.xlsx'
]

sheet_name = 'Sheet1'
separators = ['分隔符1', '分隔符2', '等等']

# 合并所有表格到一个 DataFrame
combined_df = merge_tables(excel_files, sheet_name, separators)

# 将结果保存到新的 Excel 文件
combined_df.to_excel(r'D:\输出路径\合并结果.xlsx', index=False)

在这个版本中:
1. 我们明确使用原始字符串(`r'...'`)格式处理文件路径,避免任何路径中的特殊字符导致的问题。
2. 在读取文件之前添加了文件存在性检查,确保文件确实存在。

你可以尝试运行这个版本,看看是否解决了路径相关的问题。如果还有其他问题或新的挑战,随时欢迎继续探讨!

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

使用道具 举报

 楼主| 发表于 2024-6-22 11:39:28 | 显示全部楼层
FishC 发表于 2024-6-22 11:31
好的,那这个问题不太可能仅仅是命名问题,我们再来仔细看看路径问题。路径中使用特殊字符和文件名可能 ...

那现在如果合并的时候保留表格中的格式呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 22:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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