【问题标题】:Why does 7-zip not decode what is encoded by zlib.compress()?为什么 7-zip 不解码 zlib.compress() 编码的内容?
【发布时间】:2021-11-03 06:45:56
【问题描述】:

在下面的Python (3.10)程序testCompress.py中,作为测试输入,源代码本身被压缩应用zlib,并应在 Windows 10 上使用 7-zip (20.00 alpha) 解压缩。但它失败了。不接受压缩字节作为存档。输出在程序下方给出。

这是摘录。我真正的问题是,使用 Java java.util.zip.GZIPInputStreamZipInputStream解压缩 Python 压缩文件>。他们还证明字节不是存档。

from tempfile import gettempdir
from zlib import compress
from subprocess import run

filename=r"testCompress.py"
zipname = gettempdir() + r"\zipped.zip"
unzippedname = gettempdir() + r"\unzipped.txt"
unzip = r'"C:\Program Files\7-Zip\7z.exe" x ' + zipname

# zip using zlib

with open(filename,"r") as f:
    text = f.read()
b = bytes(text,"ascii")
bcompressed = compress(b)
with open(zipname,"wb") as f:
    f.write(bcompressed)
    f.close()

# unzip using 7-zip
print("now unzipping on cmd level", unzippedname)
run(unzip, shell=True)

导致输出:

PS C:\Users\ngong\python-workspace> & C:/Users/ngong/AppData/Local/Programs/Python/Python310/python.exe c:/Users/ngong/python-workspace/xslt/testCompress.py
unzipping C:\Users\NGONG\AppData\Local\Temp\unzipped.txt

7-Zip 20.00 alpha (x64) : Copyright (c) 1999-2020 Igor Pavlov : 2020-02-06

Scanning the drive for archives:
1 file, 9041 bytes (9 KiB)

Extracting archive: C:\Users\NGONG\AppData\Local\Temp\zipped.zip
ERROR: C:\Users\NGONG\AppData\Local\Temp\zipped.zip
C:\Users\NGONG\AppData\Local\Temp\zipped.zip
Open ERROR: Can not open the file as [zip] archive


ERRORS:
Is not archive

Can't open as archive: 1
Files: 0
Size:       0
Compressed: 0
PS C:\Users\ngong\python-workspace> 

【问题讨论】:

  • 抱歉,这个问题问得太快了:我忽略了——显然——gzip 文件需要more 而不仅仅是压缩字节。我应该留下它还是删除它? stackoverflow 最好的习惯是什么?
  • 如果您认为错误是其他人将来可能犯的错误,那么这仍然可以作为他们的有用参考。在这种情况下,您应该发布答案并在系统允许时接受(当您被允许接受自己的答案时会有更长的延迟;系统会让您等待 48 小时)。如果这真的只是一个错字(或 think-o),那么我们有一个密切的理由(stackoverflow.com/help/on-topic 的#2)。如果您想在此基础上结束此问题,请在此处的评论中回复我,我可以为您完成。
  • @CodyGray 超级,谢谢!没有人是完美的,尤其是我。当我在 Python 中寻找压缩字符串时,我没有找到 gzip,而只是 zlib。这个错误很可能会在其他人身上重演。

标签: python zip gzip


【解决方案1】:

zlib.compress() 总是会产生一个 zlib 流。在 Java 方面,您显然会寻找 gzip 流或 zip 文件。这是三种不同的东西。

您可以在 Python 中使用 zlib.compressobj() 来生成 gzip 流。 (有关如何请求,请参阅文档。)

有关这三种格式的一些背景信息,请参阅 this answer

【讨论】:

    【解决方案2】:

    通过 gzip 交换 Python 模块 zlib 不能解释错误,但可以作为一种解决方法。

    from tempfile import gettempdir
    import gzip
    from subprocess import run
    
    filename=r"testGzip.py"
    zipname = gettempdir() + r"\zipped.gz"
    unzippedname = gettempdir() + r"\unzipped.txt"
    unzip = r'"C:\Program Files\7-Zip\7z.exe" x ' + zipname
    
    # zip using zlib
    
    with gzip.open(zipname,"wb") as gz:
        with open(filename,"r") as f:
            gz.write( bytes(f.read(), "utf-8") )
            gz.close()
    
    # unzip using 7-zip
    print("now unzipping on cmd level", unzippedname)
    run(unzip, shell=True)
    

    导致预期的输出:

    PS C:\Users\ngong\python-workspace> & C:/Users/ngong/AppData/Local/Programs/Python/Python310/python.exe c:/Users/ngong/python-workspace/testGzip.py
    now unzipping on cmd level C:\Users\NGONG\AppData\Local\Temp\unzipped.txt
    
    7-Zip 20.00 alpha (x64) : Copyright (c) 1999-2020 Igor Pavlov : 2020-02-06
    
    Scanning the drive for archives:
    1 file, 305 bytes (1 KiB)
    
    Extracting archive: C:\Users\NGONG\AppData\Local\Temp\zipped.gz
    --
    Path = C:\Users\NGONG\AppData\Local\Temp\zipped.gz
    Type = gzip
    Headers Size = 17
    
    Everything is Ok
    
    Size:       484
    Compressed: 305
    

    【讨论】:

    猜你喜欢
    • 2023-03-09
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    相关资源
    最近更新 更多