Errno 22 无效参数 - Zipfile 被跳过

Errno 22 Invalid argument - Zipfile Is Skipped

我正在 Python 中开展一个项目,在该项目中,我从包含日志文件的压缩文件夹中解析数据。该代码适用于大多数 zip,但偶尔会抛出此异常:

[Errno 22] Invalid argument

因此,将跳过整个文件,从而从结果中排除所需日志文件中的数据。当我尝试使用默认的 Windows 实用程序提取压缩文件时,我遇到了这个错误: Zip error 但是,当我尝试使用 7zip 解压文件时,它成功了,但出现了 2 个错误:

1 <path> Unexpected End of Data
2 Data error:  x.csv

x.csv 与我试图解析的日志完全无关,因此,我需要编写具有弹性的代码,即使不相关的文件损坏,它仍然能够解析其他没有的日志。

目前,我正在使用 zipfile 模块将文件解压到内存中。有没有一种可靠的方法可以在不跳过整个文件的情况下执行此操作?

更新 1:我认为我 运行 遇到的错误是 zip 文件缺少页脚。我在十六进制编辑器中查看它时意识到了这一点。我真的不知道如何使用 Python 安全地编辑实际文件。 这是我用来将 zip 提取到内存中的代码:

    for zip in os.listdir(directory):
        try:
            if zip.lower().endswith('.zip'):
                if os.path.isfile(directory + "\" + zip):
                    logs = zipfile.ZipFile(directory + "\" + zip)
                    for log in logs.namelist():
                        if log.endswith('log.txt'):
                            data = logs.read(log)

编辑 2:错误的追溯:

Traceback (most recent call last):
  File "c:/Users/xxx/Desktop/Python Porjects/PE/logParse.py", line 28, in parse
    logs = zipfile.ZipFile(directory + "\" + zip)
  File "C:\Users\xxx\AppData\Local\Programs\Python\Python37\lib\zipfile.py", line 1222, in __init__
    self._RealGetContents()
  File "C:\Users\xxx\AppData\Local\Programs\Python\Python37\lib\zipfile.py", line 1289, in _RealGetContents
    raise BadZipFile("File is not a zip file")
zipfile.BadZipFile: File is not a zip file

堆栈跟踪似乎表明不是您的代码未能成功读取文件,而是 Python 管理 zip 的模块引发了错误。

看起来 python zip 管理器比其他程序更严格(参见 this bug 用户报告 python 行为与其他程序作为 GNOME 存档管理器之间的差异) .

也许,有一个错误报告要做。