每个文件夹内有多个文件夹或xlsx文件,迭代每个文件夹并读取这些excel文件,但出现zipfile.BadZipFile错误如何解决(即使我并没有zip压缩文件)?

在当前路径中,有多个文件夹,每个文件夹内有多个文件夹或xlsx文件,我想迭代每个文件夹并读取这些excel文件,直到没有文件夹或所有xlsx文件被读取。有50多个文件夹和2000多个excel文件。以下是我的代码:

import os
import pandas as pd

current_path=os.getcwd()
dfs = []

def process_folder(path):
    for item in os.listdir(path):
        item_path=os.path.join(path, item)

        if os.path.isdir(item_path):
            process_folder(item_path)
        
        elif item.endswith('.xlsx'):
            df = pd.read_excel(item_path)
            dfs.append(df)

process_folder(current_path)
result_df = pd.concat(dfs, ignore_index=True)
result_df.to_excel('result.xlsx')

当我运行代码时,它显示错误"Excel file cannot be determined, you must specify an engine manually".所以我修改了read_excel: df = pd.read_excel(item_path, engine='openpyxl')。然后就出现了错误: "zipfile.BadZipFile: File is not a zip file"。但是我并没有读取任何zip文件。不知道为什么会出现这个错误

你的xlsx文件不是一个有效的zip文件,可能是因为它损坏了或者被修改了。你用Office创建一个新的xlsx文件,然后用Python读取它
参考一下跟你一样的错误     https://stackoverflow.com/questions/57817758/badzipfile-file-is-not-a-zip-file-error-popped-up-all-of-a-sudden    

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    答案:

    你遇到的zipfile.BadZipFile错误是由于某些xlsx文件被误识别为zip文件而导致的。这种情况通常发生在文件损坏或文件格式错误的情况下。

    为了解决这个问题,你可以在读取xlsx文件之前,先检查一下文件的类型。可以通过使用mimetypes模块来获取文件的MIME类型。尽管xlsx文件的MIME类型应该是"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",但我们还是可以使用这种方式来排除一些意外情况。

    以下是修改后的代码示例:

    import os
    import pandas as pd
    import mimetypes
    
    root_path = "/path/to/root/folder"
    
    def process_folder(folder_path):
        for item in os.listdir(folder_path):
            item_path = os.path.join(folder_path, item)
            if os.path.isdir(item_path):
                process_folder(item_path)
            elif mimetypes.guess_type(item_path)[0] == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":
                try:
                    df = pd.read_excel(item_path, engine='openpyxl')
                    # 在这里对df进行处理
                except Exception as e:
                    print(f"Error reading file {item_path}: {e}")
    
    process_folder(root_path)
    

    在示例代码中,我们使用mimetypes.guess_type(item_path)[0]来获取文件的MIME类型,并与预期的xlsx文件的MIME类型进行比较。如果类型匹配,我们就尝试读取文件,否则就跳过该文件并输出错误信息。

    这样做可以排除掉文件类型不正确的文件,避免再次出现zipfile.BadZipFile错误并处理其他类型的文件。如果仍然存在问题,可以通过打印出异常信息来帮助进一步排查错误原因。

    希望这个解决方案对你有帮助!如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^