如何用julia不解压而直接读取Zip文件中的txt文档?

查了好多资料都没找到满意答案,利用ZipFile可以读取Zip文件中txt的文件名,但在read txt中的内容的时候,显示无此文档,当然这可以理解,本来Zip文件还没解压,确实还没有这个文档,请问大家遇到过类似的问题么?谢谢!

除非这个 zip 就是打包了一下,没有压缩,你才有机会直接解析它得到文档。

通常情况下,肯定要解压之后才能读取内容。
能做的优化一般就是多文件时,只解压特定的文件,并且文件不落地。

有现成的包可以用,调用的 zlib

感谢您的回复!
我的zip文件确实只是对txt打包,没有压缩,利用ZipFile.jl可以读取zip中打包文件的文件名,无法读取文件内容,不知是否有不解包而直接读取txt内容的方法?。
直接读取Zip中的txt的这个需求主要是考虑到解压缩(文件落地)可能会耗费额外时间且会占用一定硬盘空间,且Zip中的每个txt文件都要读取,这也正是苦恼的地方。
python可以实现直接读取,可能julia还需要完善。
再次感谢您的回复!

这样不行吗?这个是文档里的例子。

julia> r = ZipFile.Reader("/tmp/example.zip");
julia> for f in r.files
          println("Filename: $(f.name)")
          write(stdout, read(f, String));
       end
julia> close(r)

应该说 ZipFile 就没有 unzip 的功能吧。得自己读了然后写入硬盘。

主要原因应该是 zlib 根本就不操纵文件,所以没必要先解压后读取。

Zlib is not a library for handling .zip files. It supports decompressing zlib and gzip streams, both of which work on the level of a single stream of data, rather than an “archive” format like .zip.

看了下源码确认是直接读取信息的

  • 首先新建 Reader 对象时会调用打开 open 对应的 zip 文件。
  • 然后继续初始化,在 L106 调用 _getfiles 直接解析 zip 的文件头,得到文件列表
  • 文件列表里的文件为 ReadableFile <: IO,这样就能直接用 Base.read 读取了。具体的读取实现为 _read
1 个赞

成功了!可以读,ZipFile不支持open和readline,得用IO输出,参考修改了您推荐的代码,可能有点笨,但是有效。

r = ZipFile.Reader(indir[1]);
a=[];
io=IOBuffer()
for f in r.files
         println("Filename: $(f.name)")
         write(io, read(f, String));
end
close(r)
A=String(take!(io));
Btemp=split(A,"\r\n"); #分行提取

谢谢!

试试TableReader.jl.

Read stdout from a process.

dataframe = readcsv(unzip -p data.zip somefile.csv)

地址:https://github.com/bicycle1885/TableReader.jl