V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
rogwan
V2EX  ›  Python

zipfile 解压文件包中,有文件夹是中文名,就出错

  •  
  •   rogwan · Sep 16, 2017 · 4047 views
    This topic created in 3151 days ago, the information mentioned may be changed or developed.
    开发环境是 ubuntu14 的英文桌面版,开发环境中没有问题。

    服务器上是 ubuntu14 的英文 server 版,zipfile 解压文件包,有文件夹是中文名,extractall() 就出错了。

    两个环境都是 python3.x,不知道问题出在哪?
    11 replies    2018-06-27 10:49:22 +08:00
    ltux
        1
    ltux  
       Sep 16, 2017
    连报什么错都不知道,难道能凭空 debug?
    八成是文件名编码问题呗。提示:zip 标准默认文件名编码是 cp437
    lolizeppelin
        2
    lolizeppelin  
       Sep 16, 2017 via Android
    看源码 一个一个文件解压
    wellsc
        3
    wellsc  
       Sep 16, 2017 via iPhone
    把 python 版本降到 3.4 试试看,我在 ubuntu14 上也遇到过类似的问题,后来通过降版本号解决了
    rogwan
        4
    rogwan  
    OP
       Sep 16, 2017
    @ltux 我知道是什么错误:就是文件名编码的问题。我是征对性的测试,只是奇怪本地环境和 server 环境一样,server 上中文名会编码通不过,比较奇怪。

    @lolizeppelin 老外大神都是英文文件名,根本遇不到这种 bug (@_@)

    @wellsc
    @ltux
    是啊,看了源码,zipfile 默认 cp437 和 utf-8,try 了一下 cp437,error 就用 utf-8。没有参数可以设定。要是中文名 gb2312 都不知道怎么 encode
    ltux
        5
    ltux  
       Sep 16, 2017
    要是文件名编码 gb2312,那就 file_name.encode('cp437').decode('gbk') 即可。zipfile 没有提供选项,需要自己处理。如果能 extractall() 成功,就自己改名字。如果不能 extractall(),就用 ZipFile.open() 自己处理文件内容和文件名。
    rogwan
        6
    rogwan  
    OP
       Sep 16, 2017 via Android
    @ltux 在本地开发环境,可以 extractall()成功;在 Server 环境 extractall()不成功,系统没办法识别中文文件夹和文件名。

    感觉奇怪的就是在这个地方。因为 extractall()都没有设置选项,本地可以成功 extract all,说明只要环境设置 OK 就能解析中文文件名,就可以。只是我没发现这个环境设置参数是哪个,所以 Server 上出错,就不知道改哪个地方啦。
    also24
        7
    also24  
       Sep 17, 2017
    也许是 locale 没设置好?

    试试 export LC_ALL="zh_CN.UTF-8" 怎么样?
    aver4vex
        8
    aver4vex  
       Sep 17, 2017
    先用 locale 看下是否一致,
    congeec
        9
    congeec  
       Sep 17, 2017
    zip 标准太老,根本没有考虑编码。咋办?
    1. 调用外部 7z 或 unar 来解压
    2. 提前用 iconv 把文件名编码换成 utf-8
    3. 用第三方库,目前我没发现 Python 3 可以用的

    吐槽:你知道报错信息,看帖的不知道啊
    rogwan
        10
    rogwan  
    OP
       Sep 17, 2017
    @aver4vex
    @also24

    是的,我试过改 locale 的设置,重启之后,python 测试:
    import locale
    locale.getpreferredencoding()
    locale.getdefaultlocale()

    开发环境是:
    UTF-8
    ('en_US', 'UTF-8')

    server 环境是:
    ANSI_X3.4-1968
    (None, None)

    看起来,就是 defaultlocale 没生效。



    @congeec

    我用了不同的编码专门去测试哪一行 extractall()的运行结果,记录日志,英文的都能正确运行通过,所以知道是那一行运行错误,只是不知道怎么正确 debug 了
    watermelon92
        11
    watermelon92  
       Jun 27, 2018
    @rogwan 你好!我也遇到一个类似的解压问题,可以给个联系方式交流下么?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2378 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 56ms · UTC 15:36 · PVG 23:36 · LAX 08:36 · JFK 11:36
    ♥ Do have faith in what you're doing.