2017-07-03 161 views
3

我使用Julia的ZipFile包來提取和處理csv文件。沒問題,但是當我在zip文件中遇到壓縮文件時,我想要處理它,但遇到錯誤。Julia:在Zip文件中提取Zip文件

朱莉婭ZipFile的文檔是在這裏:https://zipfilejl.readthedocs.io/en/latest/

下面的代碼:

using ZipFile 
using DataFrames 
function process_zip(zip::ZipFile.ReadableFile) 

    if split(zip.name,".")[end] == "zip" 

     r = ZipFile.Reader(zip) #error: MethodError: no method matching seekend(::ZipFile.ReadableFile) 

     for f in r.files 
      process_zip(f) 
     end 
    end 

    if split(zip.name,".")[end] == "csv" 
     df = readtable(zip) #for now just read it into a dataframe 
    end 

end 

r = ZipFile.Reader("yourzipfilepathhere"); 

for f in r.files 
    process_zip(f) 
end 
close(r) 

到ZipFile.Reader調用給出了錯誤:

MethodError: no method matching seekend(::ZipFile.ReadableFile) 
Closest candidates are: 
    seekend(::Base.Filesystem.File) at filesystem.jl:191 
    seekend(::IOStream) at iostream.jl:57 
    seekend(::Base.AbstractIOBuffer) at iobuffer.jl:178 
    ... 

Stacktrace: 
[1] _find_enddiroffset(::ZipFile.ReadableFile) at /home/chuck/.julia/v0.6/ZipFile/src/ZipFile.jl:259 
[2] ZipFile.Reader(::ZipFile.ReadableFile, ::Bool) at /home/chuck/.julia/v0.6/ZipFile/src/ZipFile.jl:104 
[3] process_zip(::ZipFile.ReadableFile) at ./In[27]:7 
[4] macro expansion at ./In[27]:18 [inlined] 
[5] anonymous at ./<missing>:? 

如此看來ZipFile的包無法處理來自zip文件的zip文件,因爲它無法對它做一個seekend。

有關如何做到這一點的任何想法?

+0

我想你可能需要先解壓縮zip文件,然後在提取後對它們進行遞歸。 – gaborous

+0

我應該解壓縮到一個磁盤文件,還是我可以解壓到一個內存文件?我是Julia的新手,我不知道如何創建內存文件。 –

+0

它似乎只適用於文件,但你可能會嘗試通過將你的內存zip對象包裝成一個類似文件的類來實現ZipFile操作zip對象所需的方法。但讓我們看看是否有更多Julia經驗的人可以爲您提供更優雅的解決方案。 – gaborous

回答

2

解決方法是將zip文件讀取到IOBuffer中。 ZipFile.Reader能夠處理IOBuffer。這裏是工作代碼:

using ZipFile 
using DataFrames 
function process_zip(zip::ZipFile.ReadableFile) 

    if split(zip.name,".")[end] == "zip" 

     iobuffer = IOBuffer(readstring(zip)) 
     r = ZipFile.Reader(iobuffer) 

     for f in r.files 
      process_zip(f) 
     end 
    end 

    if split(zip.name,".")[end] == "csv" 
     df = readtable(zip) #for now just read it into a dataframe 
    end 

end 

r = ZipFile.Reader("yourzipfilepathhere"); 

for f in r.files 
    process_zip(f) 
end 
close(r)