为啥 7-zip 不解码 zlib.compress() 编码的内容?
Posted
技术标签:
【中文标题】为啥 7-zip 不解码 zlib.compress() 编码的内容?【英文标题】: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.GZIPInputStream 或 ZipInputStream解压缩 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 而不仅仅是压缩字节。我应该留下它还是删除它? *** 最好的习惯是什么? 如果您认为错误是其他人将来可能犯的错误,那么这仍然可以作为他们的有用参考。在这种情况下,您应该发布答案并在系统允许时接受(当您被允许接受自己的答案时会有更长的延迟;系统会让您等待 48 小时)。如果这真的只是一个错字(或 think-o),那么我们有一个密切的理由(***.com/help/on-topic 的#2)。如果您想在此基础上结束此问题,请在此处的评论中回复我,我可以为您完成。 @CodyGray 超级,谢谢!没有人是完美的,尤其是我。当我在 Python 中寻找压缩字符串时,我没有找到 gzip,而只是 zlib。这个错误很可能会在其他人身上重演。 见***.com/questions/20762094/… 【参考方案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
【讨论】:
感谢newbedev以上是关于为啥 7-zip 不解码 zlib.compress() 编码的内容?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 apktool 不解码 versionCode 和 versionName?
不确定为啥我的服务器在帧解码器中收到“channelInterestChanged”事件