【问题标题】:"BadZipFile: File is not a zip file" - Error popped up all of a sudden“BadZipFile:文件不是 zip 文件” - 突然弹出错误
【发布时间】:2020-01-09 01:56:14
【问题描述】:

前一分钟我的脚本连续运行了好几天,下一分钟我收到了这个错误。

  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

为了澄清我不使用任何 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)

代码没有被编辑或任何东西,刚开始不工作。

【问题讨论】:

  • Excel 工作簿在内部实际上是一个 Zip 存档。该错误表示文件已损坏。
  • 我在想,也许 openpyxl 更新了?
  • 啊,我明白了。原来文件被锁定了??不知道为什么。
  • 该文件也无法删除,因为它说它正在python中使用。我将其关闭,并设法删除了损坏的文件。

标签: python


【解决方案1】:

Excel XLSX 文件已压缩,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")

按文件 mimetype

如果您碰巧可以访问文件 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")

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 是的。但是在我将第一个数据帧写入 excel 后,它被损坏了。第二次尝试打开该 excel 并附加新数据时,它显示为好像已损坏。我也无法手动打开它。你怎么修好它的?使用 'writer.save()' 和 'writer.close()' 是否存储不正确?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-07-11
      • 1970-01-01
      • 2016-02-25
      • 2021-11-25
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多