首页 > 解决方案 > 在 Jython 中提取 zip 文件时,“TypeError:字符映射必须返回整数、无或 unicode”

问题描述

假设和我想要实现的目标

我正在使用Python2.7 (Jython)编写代码,因为我使用的是 ImageJ。

我想在 Python 2.7 中提取 zip 文件,但我做不到。

我在文件夹“OutletHDD”中有一个名为 RoiSet.zip 的 zip 文件,我想将其解压缩到文件夹“hoge”中。

遇到的问题和错误信息

Started ver2.py at Wed Dec 16 21:34:19 JST 2020
Traceback (most recent call last):
  File "C:\Users\For  Programming\Documents\Python Scripts\OutletHDD\ver2.py", line 12, in <module>
    imp = IJ.openImage(PICPATH)
  File "C:\Users\FORPRO~1\Desktop\Fiji.app\jars\jython-slim-2.7.2.jar\Lib\zipfile.py", line 1038, in extractall
  File "C:\Users\FORPRO~1\Desktop\Fiji.app\jars\jython-slim-2.7.2.jar\Lib\zipfile.py", line 1026, in extract
  File "C:\Users\FORPRO~1\Desktop\Fiji.app\jars\jython-slim-2.7.2.jar\Lib\zipfile.py", line 1059, in _extract_member
TypeError: character mapping must return integer, None or unicode

    at org.python.core.Py.TypeError(Py.java:236)
    at org.python.modules._codecs.translateCharmap(_codecs.java:446)
    at org.python.core.PyUnicode.unicode_translate(PyUnicode.java:2126)
    at org.python.core.PyUnicode$unicode_translate_exposer.__call__(Unknown Source)
    at org.python.core.PyObject.__call__(PyObject.java:465)
    at zipfile$py._extract_member$45(C:/Users/FORPRO~1/Desktop/Fiji.app/jars/jython-slim-2.7.2.jar/Lib/zipfile.py:1081)
    at zipfile$py.call_function(C:/Users/FORPRO~1/Desktop/Fiji.app/jars/jython-slim-2.7.2.jar/Lib/zipfile.py)
    at org.python.core.PyTableCode.call(PyTableCode.java:173)
    at org.python.core.PyBaseCode.call(PyBaseCode.java:187)
    at org.python.core.PyFunction.__call__(PyFunction.java:449)
    at org.python.core.PyMethod.__call__(PyMethod.java:171)
    at zipfile$py.extract$43(C:/Users/FORPRO~1/Desktop/Fiji.app/jars/jython-slim-2.7.2.jar/Lib/zipfile.py:1026)
    at zipfile$py.call_function(C:/Users/FORPRO~1/Desktop/Fiji.app/jars/jython-slim-2.7.2.jar/Lib/zipfile.py)
    at org.python.core.PyTableCode.call(PyTableCode.java:173)
    at org.python.core.PyBaseCode.call(PyBaseCode.java:187)
    at org.python.core.PyFunction.__call__(PyFunction.java:449)
    at org.python.core.PyMethod.__call__(PyMethod.java:171)
    at zipfile$py.extractall$44(C:/Users/FORPRO~1/Desktop/Fiji.app/jars/jython-slim-2.7.2.jar/Lib/zipfile.py:1037)
    at zipfile$py.call_function(C:/Users/FORPRO~1/Desktop/Fiji.app/jars/jython-slim-2.7.2.jar/Lib/zipfile.py)
    at org.python.core.PyTableCode.call(PyTableCode.java:173)
    at org.python.core.PyBaseCode.call(PyBaseCode.java:306)
    at org.python.core.PyBaseCode.call(PyBaseCode.java:141)
    at org.python.core.PyFunction.__call__(PyFunction.java:426)
    at org.python.core.PyMethod.__call__(PyMethod.java:141)
    at org.python.pycode._pyx23.f$0(C:/Users/For  Programming/Documents/Python Scripts/OutletHDD/ver2.py:13)
    at org.python.pycode._pyx23.call_function(C:/Users/For  Programming/Documents/Python Scripts/OutletHDD/ver2.py)
    at org.python.core.PyTableCode.call(PyTableCode.java:173)
    at org.python.core.PyCode.call(PyCode.java:18)
    at org.python.core.Py.runCode(Py.java:1687)
    at org.python.core.__builtin__.eval(__builtin__.java:497)
    at org.python.core.__builtin__.eval(__builtin__.java:501)
    at org.python.util.PythonInterpreter.eval(PythonInterpreter.java:255)
    at org.python.jsr223.PyScriptEngine.eval(PyScriptEngine.java:57)
    at org.python.jsr223.PyScriptEngine.eval(PyScriptEngine.java:31)
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
    at org.scijava.script.ScriptModule.run(ScriptModule.java:157)
    at org.scijava.module.ModuleRunner.run(ModuleRunner.java:165)
    at org.scijava.module.ModuleRunner.call(ModuleRunner.java:124)
    at org.scijava.module.ModuleRunner.call(ModuleRunner.java:63)
    at org.scijava.thread.DefaultThreadService.lambda$wrap$2(DefaultThreadService.java:225)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Started New_.py at Wed Dec 16 21:37:42 JST 2020

源代码。

import zipfile
from ij.plugin.frame import RoiManager
from ij.process import ImageProcessor
zippath = "C:\Users\For Programming\Documents\Python Scripts\OutletHDD\RoiSet.zip"


ZipObj = zipfile.ZipFile(zippath) 
ZipObj.extractall("C:\Users\For Programming\Documents\Python Scripts\OutletHDD\hoge") #Unzip and move the Zip file
ZipObj.close() 

我试过的

我以为可能是unicode类型、str类型的bug,我想尝试做str()、unicode()等,但是没有成功。

附加信息(固件/工具版本等)

我从日本写代码(可能与字符代码有关)

Windows10 64位

2.7.2 (v2.7.2:925a3cc3b49d, Mar 21 2020, 10:12:24) [Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)]

我想了解这方面的任何信息,如果我的信息不足,请告诉我

标签: python-2.7zipjythonimagej

解决方案


也许将提取路径转换为 ​​ascii 可以解决该错误?示例:"C:\Users\For Programming\Documents\Python Scripts\OutletHDD\hoge".encode("ascii")


推荐阅读