前提・実現したいこと
ImageJという画像解析ソフトを使っている関係で、やむを得ずPython2.7でコードを書いています。
Python2.7でzipファイルを解凍したいのですが、する事ができません。
OutletHDDというフォルダーにRoiSet.zipというzipファイルがあり、それをhogeというフォルダーに解凍したいです。
発生している問題・エラーメッセージ
TypeError: character mapping must return integer, None or unicode
該当のソースコード
Python2
1import zipfile 2from ij.plugin.frame import RoiManager 3from ij.process import ImageProcessor 4zippath = "C:\Users\For Programming\Documents\Python Scripts\OutletHDD\RoiSet.zip" 5 6 7ZipObj = zipfile.ZipFile(zippath) 8ZipObj.extractall("C:\Users\For Programming\Documents\Python Scripts\OutletHDD\hoge") #Zipファイルを解凍して移動 9ZipObj.close()
試したこと
unicode型,str型のバグかと思い、str(),unicode()等を行ってみたいのですが、上手く動きませんでした。
補足情報(FW/ツールのバージョンなど)
windows10 64bit
2.7.2 (v2.7.2:925a3cc3b49d, Mar 21 2020, 10:12:24)
[Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)]
追記
path周りの環境が完全にぶっ壊れてる事を疑って、shuntil系のcopyやmoveを試してみたのですが問題無く動きました。
今回、解凍しようとしていたzipファイルの中身はroiファイル(.roi)という特殊なファイル形式なのですが、他のファイル形式(例えばtxt)では問題無く解凍する事ができました。
恐らくPythonの問題ではなく、ImageJ側の問題の方が強いです。
追記2
この様なコードでzipフォルダーの中のファイルパスをの文字コードを確かめてみたのですが、全てunicode型でした。
import zipfile with zipfile.ZipFile("C://Users//For Programming//Documents//Python Scripts\OutletHDD//RoiSet.zip") as existing_zip: lis = existing_zip.namelist() print(lis) for i in lis: print(isinstance(i,unicode))
Daregadaさんから教えて貰った下記のリンクを見てみると、恐らく解凍できないのはzipフォルダーの中に入っているファイルが全てunicode型である事が原因だと思います。
「Python 2.7.4 fails while extracting zip files when 'member' is a unicode path.」
https://bugs.python.org/msg186264
そこでZipフォルダーの中に入っているファイルパスを全て"utf-8"型に変更しようと思ったのですが、zipフォルダーを解凍しないという条件下でどの様に変更すればいいか分かりません。
Python2
1import zipfile 2import os 3import codecs 4 5with zipfile.ZipFile(r"C:\Users//For Programming//Documents//Python Scripts//OutletHDD//RoiSet.zip") as existing_zip: 6 lis = existing_zip.namelist() 7 8for i in lis: 9 fullpath = r"C://Users//For Programming//Documents//Python Scripts//OutletHDD//RoiSet.zip" + "//" + i 10 fullpath_utf8 = fullpath.decode("utf-8") 11 os.rename(fullpath, fullpath_utf8) 12
このコードではこの様なエラーコードが出てしまいました。zipファイルの中を普通のtextファイルに変えた場合も、同様のエラーが出たので、深く調べきれていませんが、恐らくzipファイル内のファイルをrenameした時のエラーだと思います。
OSError: (0, "Couldn't rename file")
zipフォルダ内のファイルの文字コード/パスの変更はどの様に変更すればいいでしょうか?
参考にしたサイト
https://qiita.com/HidKamiya/items/c164a6ce07820f65c501
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/17 02:14
2020/12/17 03:28
2020/12/17 03:34
2020/12/17 04:06
2020/12/17 07:16
2020/12/17 07:56
2020/12/17 08:14