う~ん。色々やってみたのですが,エラーは再現できていません。
次のようなプログラムでもあっさり通りますね。
julia
1using DelimitedFiles
2using ZipFile
3using DataFrames
4using CSV
5
6zipfilename = "test20240117.zip"
7
8function test(filepath::AbstractString)
9 r = ZipFile.Reader(filepath)
10 df = CSV.read(read(r.files[1]), DataFrame, header=0)
11 close(r)
12 return df
13end
14
15w = ZipFile.Writer(zipfilename)
16for k in 1:10
17 f = ZipFile.addfile(w, "($k).csv")
18 writedlm(f, rand(Float64, (10000, 20)), ',')
19 close(f)
20end
21
22close(w)
23
24df_1st = test(zipfilename)
25
26rm(zipfilename)
27
エラーのメッセージについては,私が想像するに
次のようなフォルダの階層があった時,juliaのREPLで,
cd("C:\\Users\\ujimushi\\Downloads\\zipfolder")
を実行している状態で
エクスプローラーからzipfolder
を削除しようとした時に発生するエラーメッセージのような気がします。
これは,pythonのインタラクティブなシェル上で
python
1import os
2os.chdir('F:\\Users\\ujimushi\\Downloads\\zipfolder')
とした状態で,エクスプローラーからzipfolder
を削除しようとしても削除できないのと同じで,
「そういうもの」としか言いようがないです。
質問文の中でhttps://github.com/JuliaLang/julia/issues/43673 のリンクを出していますが,かえって
質問に対するミスリードを誘っているような気がします。
ただ,Windows環境で質問文のような状態に陥るのはわりと簡単です。
次のようにREPLからclose
する前に同じような文で二重に開くと,
最初に開いていたzipファイルを参照する方法が無くなる(二回目のReader
で新規にZipFileハンドリング用オブジェクトを作成しそれをr
で参照するため,最初に開いたオブジェクトはZipFileを開いたまま中ぶらりんになる)ので,
そのスクリプトが動いている限りtest.zip
をクローズする方法が無くなります。
julia
1filepath = `test.zip`
2r = ZipFile.Reader(filepath)
3r = ZipFile.Reader(filepath)
4close(r)
5close(r)
6rm(filapath) # => エラー
Windowsの場合,普通のopen
関数でも起こりがちですね。
ただし,次のように同じファイルを二重にオープン場合でも,それぞれでクローズした場合は正常に動作します。
julia
1filepath = `test.zip`
2r1 = ZipFile.Reader(filepath)
3r2 = ZipFile.Reader(filepath)
4close(r1)
5close(r2)
6rm(filapath) # => 正常に削除
おそらくREPLか何かでクローズし忘れたか,オープンした後でエラーになってクローズし忘れたか,二重オープンをしたかの状態になったが,
ネット上で自分にとって心地良い情報があったのでそれを信じたのではないかと思います。
追記
ZipFile.Reader
はIO
でも仕様的に大丈夫なので,次のように明示的にclose
しないですむ書き方の方がいいのでは?
julia
1function test(filepath::AbstractString)
2 df = open(filepath, "r") do io
3 r = ZipFile.Reader(io)
4 CSV.read(read(r.files[1]), DataFrame, header=0)
5 end
6 return df
7end
8