use*_*186 6 python compression
所以,这是一个看似简单的问题,但我显然非常沉闷.我有一个小脚本从网页下载所有的.bz2文件,但由于某种原因,该文件的解压缩让我头疼.
我是一个Python新手,所以答案可能很明显,请帮助我.
在脚本的这一部分,我已经有了这个文件,我只是想把它读出来变量,然后解压缩?是对的吗?我已经尝试了各种方法来做到这一点,我通常在这个片段的最后一行得到"ValueError:找不到流的结尾"错误.我试图打开zipfile并以无数种方式将其写入字符串.这是最新的.
openZip = open(zipFile, "r")
s = ''
while True:
newLine = openZip.readline()
if(len(newLine)==0):
break
s+=newLine
print s
uncompressedData = bz2.decompress(s)
Run Code Online (Sandbox Code Playgroud)
嗨Alex,我应该列出我尝试过的所有其他方法,因为我尝试过read()方式.
方法A:
print 'decompressing ' + filename
fileHandle = open(zipFile)
uncompressedData = ''
while True:
s = fileHandle.read(1024)
if not s:
break
print('RAW "%s"', s)
uncompressedData += bz2.decompress(s)
uncompressedData += bz2.flush()
newFile = open(steamTF2mapdir + filename.split(".bz2")[0],"w")
newFile.write(uncompressedData)
newFile.close()
Run Code Online (Sandbox Code Playgroud)
我收到错误:
uncompressedData += bz2.decompress(s)
ValueError: couldn't find end of stream
Run Code Online (Sandbox Code Playgroud)
方法B.
zipFile = steamTF2mapdir + filename
print 'decompressing ' + filename
fileHandle = open(zipFile)
s = fileHandle.read()
uncompressedData = bz2.decompress(s)
Run Code Online (Sandbox Code Playgroud)
同样的错误:
uncompressedData = bz2.decompress(s)
ValueError: couldn't find end of stream
Run Code Online (Sandbox Code Playgroud)
非常感谢您的及时回复.我真的把头靠在墙上,因为无法解压缩简单的.bz2文件而感觉非常厚.
通过by,使用7zip手动解压缩,以确保文件没有任何问题,并且解压缩得很好.
Ale*_*lli 14
您正在打开并读取压缩文件,就像它是由行组成的文本文件一样.别!不是.
uncompressedData = bz2.BZ2File(zipFile).read()
Run Code Online (Sandbox Code Playgroud)
似乎更接近你正在寻找的东西.
编辑:OP已经展示了他尝试过的一些东西(尽管我没有看到任何关于尝试过最佳方法的注释 - 我上面推荐的单线程!)但是它们似乎都有一个共同的错误,并且我重复上面的关键位:
打开...压缩文件,好像它是一个文本文件......它不是.
open(filename)甚至更明确的open(filename, 'r')打开,用于阅读,文本文件 - 压缩文件是二进制文件,因此为了正确读取它必须打开它open(filename, 'rb').((我推荐bz2.BZ2File知道它正在处理一个压缩文件,当然,所以没有必要再告诉它)).
在Python中2.*,在Unix-y系统上(即除了Windows之外的每个系统),你都可以匆忙地使用open(但在Python中3.*你不能,因为文本是Unicode,而二进制是字节 - 不同的类型).
在Windows中(以及在DOS之前),由于历史原因,因为Windows的文本文件是区别的,所以它总是必不可少的(使用两个字节而不是一个到结束行,并且至少在某些情况下,需要一个字节值得'\0x1A'作为文件的逻辑结束)因此读写低级代码必须补偿.
所以我怀疑OP正在使用Windows并且正在为不小心使用内置'rb'选项("读取二进制")付出代价open.(虽然bz2.BZ2File更简单,无论你使用什么平台! - ).
openZip = open(zipFile,"r")
如果你在Windows上运行,你可能想在这里说openZip = open(zipFile,"rb"),因为该文件可能包含CR/LF组合,并且你不希望它们被翻译.
newLine = openZip.readline()
正如亚力克指出的那样,这是非常错误的,因为"线"的概念对压缩流来说是陌生的.
s = fileHandle.read(1024)[...] uncompressedData + = bz2.decompress(s)
出于同样的原因,这是错误的.1024字节的块不太可能对解压缩器有多大意义,因为它会想要使用它自己的块大小.
s = fileHandle.read()uncompressedData = bz2.decompress(s)
如果这不起作用,我会说这是我上面提到的新线翻译问题.
小智 6
这非常有帮助.在Windows打开时,2300个文件中的44个文件丢失了文件.添加b(inary)标志以打开修复问题.
for line in bz2.BZ2File(filename, 'rb', 10000000) :
Run Code Online (Sandbox Code Playgroud)
效果很好.(10M是缓冲大小,适用于涉及的大文件)
谢谢!