假设我有一个bzip2文件(超过5GB),我只想解压缩块#x,因为我的数据就在哪里(块每次都不同).我该怎么做?
我想要制作一个所有块所在的索引,然后从文件中剪切我需要的块并将bzip2recover应用于它.
我还考虑过一次压缩1MB,然后将其附加到文件(并记录位置),并在需要时简单地抓取文件,但我宁愿保持原始的bzip2文件完好无损.
我的首选语言是Ruby,但任何语言的解决方案都很好(只要我理解原理).
我使用pythons bz2模块生成(并压缩)一个大的jsonl文件(bzip2压缩17GB).
但是,当我稍后尝试使用pbzip2解压缩时,它似乎只使用一个 CPU核心进行解压缩,这非常慢.
当我用pbzip2压缩它时,它可以在解压缩时利用多个核心.有没有办法在pthon中以pbzip2兼容格式压缩?
import bz2,sys
from Queue import Empty
#...
compressor = bz2.BZ2Compressor(9)
f = open(path, 'a')
try:
while 1:
m = queue.get(True, 1*60)
f.write(compressor.compress(m+"\n"))
except Empty, e:
pass
except Exception as e:
traceback.print_exc()
finally:
sys.stderr.write("flushing")
f.write(compressor.flush())
f.close()
Run Code Online (Sandbox Code Playgroud) file = BZ2File(SOME_FILE_PATH)
p = xml.parsers.expat.ParserCreate()
p.Parse(file)
Run Code Online (Sandbox Code Playgroud)
这是试图解析用bz2压缩的xml文件的代码.不幸的是它失败了一条消息:
TypeError: Parse() argument 1 must be string or read-only buffer, not bz2.BZ2File
有没有办法解析压缩的bz2 xml文件?
注意:p.Parse(file.read())
这里不是一个选项.我想解析一个比可用内存大的文件,所以我需要一个流.
我正在尝试编写一个实用程序函数来打开三种不同类型的文件:.bz2、.gz 和.txt。我不能只是使用File.read
,因为它给我压缩文件带来了垃圾。我正在尝试使用,Open3.popen3
以便可以给它一个不同的命令,但我收到以下代码的“没有这样的文件或目录”错误:
def file_info(file)
cmd = ''
if file.match("bz2") then
cmd = "bzcat #{file}"# | head -20"
elsif file.match("gz") then
cmd = "gunzip -c #{file}"
else
cmd = "cat #{file}"
end
puts "opening file #{file}"
Open3.popen3("#{cmd}", "r+") { |stdin, stdout, stderr|
puts "stdin #{stdin.inspect}"
stdin.read {|line|
puts "line is #{line}"
if line.match('^#') then
else
break
end
}
}
end
> No such file or directory - cat /tmp/test.txt
Run Code Online (Sandbox Code Playgroud)
该文件确实存在。我尝试使用cmd
而不是#{cmd}
在popen3 cmd
. …
我有以下存档目录:
itunes20140618.tbz
Run Code Online (Sandbox Code Playgroud)
我想从中提取单个文件:
itunes20140618/video
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
到目前为止,我正在做
$ bzip2 -d /tmp/itunes20140618.tbz
Run Code Online (Sandbox Code Playgroud)
但它似乎创建了一切tar目录.我如何只提取单个视频文件?
我正在用 Python 创建一个 HTTP 服务器,没有任何用于学习目的的 HTTP 库。现在它可以很好地提供静态文件。
我提供文件的方式是通过这段代码:
with open(self.filename, 'rb') as f:
src = f.read()
socket.sendall(src)
Run Code Online (Sandbox Code Playgroud)
但是,我想通过发送压缩数据而不是未压缩数据来稍微优化其性能。我知道我的浏览器 (Chrome) 接受压缩数据,因为它在标题中告诉我
Accept-Encoding: gzip, deflate, sdch
Run Code Online (Sandbox Code Playgroud)
所以,我把我的代码改成了这个
with open(self.filename, 'rb') as f:
src = zlib.compress(f.read())
socket.sendall(src)
Run Code Online (Sandbox Code Playgroud)
但这只是输出垃圾。我究竟做错了什么?
其实我有一个档案.我在linux环境下工作.为了安全起见,我需要提供一些密码来加密该文件.操作可能像zip,tar任何压缩.当我提取文件它应该问我密码,然后它应该被提取
提前致谢