“BadZipFile:文件不是 zip 文件”- 突然弹出错误

doo*_*aam 15 python

前一分钟我的脚本连续工作几天,下一分钟我收到此错误。

  File "<ipython-input-196-abdb28a77366>", line 1, in <module>
    runfile('F:/-/-/-/cleaner_games_appstore_babil.py', wdir='F:/-/-/-')

  File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
    execfile(filename, namespace)

  File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "F:/-/-/-/cleaner_games_appstore_babil.py", line 112, in <module>
    append_df_to_excel("stillfront.xlsx", dff, sheet_name='Apple_Babil', startrow=None, truncate_sheet=False, engine='openpyxl', header = False)

  File "F:/-/-/-/cleaner_games_appstore_babil.py", line 84, in append_df_to_excel
    writer.book = load_workbook(filename)

  File "C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\reader\excel.py", line 311, in load_workbook
    data_only, keep_links)

  File "C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\reader\excel.py", line 126, in __init__
    self.archive = _validate_archive(fn)

  File "C:\ProgramData\Anaconda3\lib\site-packages\openpyxl\reader\excel.py", line 98, in _validate_archive
    archive = ZipFile(filename, 'r')

  File "C:\ProgramData\Anaconda3\lib\zipfile.py", line 1222, in __init__
    self._RealGetContents()

  File "C:\ProgramData\Anaconda3\lib\zipfile.py", line 1289, in _RealGetContents
    raise BadZipFile("File is not a zip file")

BadZipFile: File is not a zip file
Run Code Online (Sandbox Code Playgroud)

澄清一下,我不使用任何 zip 文件。我在 StackOverflow 上找到了代码,但没有提到代码不起作用或发生错误。

该脚本应该将我的 pandas DataFrame 写入 Excel 工作表。这是产生错误的代码部分:

def append_df_to_excel(filename, df, sheet_name='Apple_Babil', startrow=None,
                       truncate_sheet=False, 
                       **to_excel_kwargs):

    # ignore [engine] parameter if it was passed
    if 'engine' in to_excel_kwargs:
        to_excel_kwargs.pop('engine')

    writer = pd.ExcelWriter(filename, engine='openpyxl')
    try:

        # try to open an existing workbook
        writer.book = load_workbook(filename)
        # get the last row in the existing Excel sheet
        # if it was not specified explicitly
        if startrow is None and sheet_name in writer.book.sheetnames:
            startrow = writer.book[sheet_name].max_row

        # truncate sheet
        if truncate_sheet and sheet_name in writer.book.sheetnames:
            # index of [sheet_name] sheet
            idx = writer.book.sheetnames.index(sheet_name)
            # remove [sheet_name]
            writer.book.remove(writer.book.worksheets[idx])
            # create an empty sheet [sheet_name] using old index
            writer.book.create_sheet(sheet_name, idx)
        # copy existing sheets
        writer.sheets = {ws.title:ws for ws in writer.book.worksheets}

    except FileNotFoundError:
        # file does not exist yet, we will create it
        pass

    if startrow is None:
        startrow = 0
    # write out the new sheet
    df.to_excel(writer, sheet_name, startrow=startrow, **to_excel_kwargs)
    # save the workbook
    writer.save()

append_df_to_excel("stillfront.xlsx", dff, sheet_name='Apple_Babil', startrow=None, truncate_sheet=False, engine='openpyxl', header = False)
Run Code Online (Sandbox Code Playgroud)

代码没有被编辑或任何东西,只是开始不起作用。

Ado*_*zis 13

ExcelXLSX文件被压缩,XLS文件则不然。

我相信这个错误与以下组合有关

  1. XLS没有拉链,并且
  2. 从 python-3.9 开始,该openpyxl模块必须与文件一起使用XLSX。

通过检查上传的 Excel 文件类型并使用适当的引擎读取,这个问题很容易解决Pandas。

按文件扩展名

from pathlib import Path
import pandas as pd

file_path = Path(filename)
file_extension = file_path.suffix.lower()[1:]

if file_extension == 'xlsx':
    df = pd.read_excel(file.read(), engine='openpyxl')
elif file_extension == 'xls':
    df = pd.read_excel(file.read())
elif file_extension == 'csv':
    df = pd.read_csv(file.read())
else:
    raise Exception("File not supported")
Run Code Online (Sandbox Code Playgroud)

按文件 mime 类型

如果您碰巧有权访问文件 mimetype,则可以执行以下测试:

import pandas as pd

if file.content_type == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
    df = pd.read_excel(file.read(), engine='openpyxl')  # XLSX
elif file.content_type == 'application/vnd.ms-excel':
    df = pd.read_excel(file.read())  # XLS
elif file.content_type == 'text/csv':
    df = pd.read_csv(file.read())  # CSV
else:
    raise Exception("File not supported")
Run Code Online (Sandbox Code Playgroud)


小智 6

正如其他人已经指出的那样,损坏的文件是罪魁祸首。

执行这些快速健全性检查:

  1. 打开 Excel 文件。数据显示正确吗?
  2. 您能否在 Windows 资源管理器中的文件详细信息中看到文件大小?

就我而言,我手动检查了 Excel 文件内容,结果发现它是空的,因为我没有正确存储文件。修复此问题后,“文件不是 zip 文件”错误就得到解决。


小智 2

这是一个非常常见的问题,很多人都在尝试解决。它与 excel 文件和 openpyxl 有关。就像 @Barmar 在他的评论中所说,xlsx、xlsm 等确实是 zip。在 python 2.7 之前它工作正常。

尝试读取和写入 csv,这不会有问题。