[{"data":1,"prerenderedAt":62},["ShallowReactive",2],{"article-93":3},{"code":4,"msg":5,"data":6,"count":14},200,"查询成功",{"id":7,"title":8,"keywords":9,"description":10,"category_id":11,"content":12,"body_html":13,"thumb_up":14,"clicks":15,"sort":14,"remark":16,"status":17,"is_open":17,"is_deleted":14,"is_top":14,"is_recommend":14,"create_time":18,"update_time":19,"image_id":20,"url":13,"member_id":14,"cate_name":21,"prev":22,"next":25,"tags":28,"words":34,"read_time":35,"comments":36,"cover":37,"relevant":38},93,"PHP执行Python脚本解压，压缩文件夹操作","PHP,Python,解压,压缩,ZIP","PHP是有解压缩类文件的，但在实际项目中，用户方使用Python脚本压缩，很容易出现中文解压乱码，导致文件内容丢失的情况，本文主要介绍PHP执行Python脚本解压缩出现的问题以及解决方法",2,"\nPHP是有解压缩类文件的，但在实际项目中，用户方使用Python脚本压缩，很容易出现中文解压乱码，导致文件内容丢失的情况，本文主要介绍PHP执行Python脚本解压缩出现的问题以及解决方法\n\n###### 1、压缩代码\n\n```python\n#-*- coding: utf-8 -*-\nimport zipfile\nimport os,sys\nimport chardet\n\nreload(sys);\nsys.setdefaultencoding('utf8')\n\ndef zip_dir(dirname, zipfilename):\n    \"\"\"\n    | ##@函数目的: 压缩指定目录为zip文件\n    | ##@参数说明：dirname为指定的目录，zipfilename为压缩后的zip文件路径\n    | ##@返回值：无\n    | ##@函数逻辑：\n    \"\"\"\n    try: \n        zipfilePath = os.path.join(dirname, zipfilename)\n        #先判断有没有之前的zip包\n        if os.path.exists(zipfilePath):\n            os.remove(zipfilePath)\n        print('start zipfile!')\n        filelist = []\n        if os.path.isfile(dirname):\n            dirname = ConvertCharSet(dirname)\n            filelist.append(dirname)\n        else :\n            for root, dirs, files in os.walk(dirname):\n                for name in files:\n                    name = ConvertCharSet(name)\n                    print('zipfile= '+ name)\n                    filelist.append(os.path.join(root, name))\n\n        zipfilename = ConvertCharSet(zipfilename)\n        zipfilename = unicode(zipfilename, 'utf-8')\n        zf = zipfile.ZipFile(zipfilename, \"w\", zipfile.zlib.DEFLATED)\n        #zf = zipfile.ZipFile(zipfilename, \"w\", zipfile.ZIP_DEFLATED)\n        for tar in filelist:\n            tar = ConvertCharSet(tar)\n            tar = unicode(tar,'utf-8')\n            arcname = tar[len(dirname):]\n            #print arcname\n            zf.write(tar,arcname)\n        zf.close()\n\n    except Exception as ex: \n        print(ex)\n\ndef ConvertCharSet(str):\n    if str:\n        if isinstance(str, unicode):\n            return str\n        data = str\n        chr_res = chardet.detect(str)\n        src_enc = chr_res['encoding'].lower()\n        if src_enc != 'utf-8':\n            data = str.decode('gb18030').encode('utf-8')\n        return data\n    return \"\"\n\nif __name__ == \"__main__\":\n    i = sys.argv[1].replace(\"'\", '')\n    o = sys.argv[2].replace(\"'\", '')\n    zip_dir(i, o)\n```\n\n###### 2、解压代码\n\n```python\n#!\u002Fusr\u002Fbin\u002Fenv python\n# -*- coding: utf-8 -*-\nimport zipfile,os,sys\nimport chardet\nreload(sys) \nsys.setdefaultencoding('utf-8')\n\ndef unzip(zip_name, unzip_dir):\n    try:\n        #unzip_dir = unzip_dir.decode('utf-8')   # 不转码会乱码\n        #zip_name = zip_name.decode('utf-8') # 不转码zipfile报错\n        #zip_name = ConvertCharSet(zip_name)\n        #zip_name = unicode(zip_name, 'gbk')\n\n        #unzip_dir = ConvertCharSet(unzip_dir)\n        #unzip_dir = unicode(unzip_dir, 'gbk')\n\n        if not os.path.exists(unzip_dir):\n            os.makedirs(unzip_dir, 0777)\n        zfobj = zipfile.ZipFile(zip_name, 'r')\n\n        for file_name in zfobj.namelist():\n            file_name = file_name.replace('\\\\', '\u002F')\n\n            #file_name = ConvertCharSet(file_name)\n            #file_name = unicode(file_name,'gbk')\n\n            print('11: '+file_name)\n            if file_name.endswith('\u002F'):\n                #try:\n                #    file_name = file_name.decode('utf-8')\n                #except UnicodeDecodeError:\n                #    file_name = file_name.decode('gbk')\n                \n                print('22: ' + file_name)\n                os.makedirs(os.path.join(unzip_dir, file_name), 0777)\n            else:\n                #try:\n                #    ext_filename = os.path.join(unzip_dir, file_name.decode('utf-8'))\n                #except UnicodeDecodeError:\n                #    ext_filename = os.path.join(unzip_dir, file_name.decode('gbk'))\n\n                ext_filename = os.path.join(unzip_dir, file_name)\n                print('33: ' + ext_filename)\n                ext_filedir = os.path.dirname(ext_filename)\n                print('44: ' + ext_filedir)\n                if not os.path.exists(ext_filedir):\n                    os.makedirs(ext_filedir, 0777)\n\n                data = zfobj.read(file_name)\n                #print('data: '+ data)\n                with open(ext_filename, 'w') as f:\n                    f.write(data)\n        zfobj.close()\n    except Exception as ex: \n        print('55: '+ ex)\n\nif __name__ == \"__main__\":\n    i = sys.argv[1].replace(\"'\", '')\n    o = sys.argv[2].replace(\"'\", '')\n    unzip(i, o)\n```\n\n###### 3、执行时编码问题，如下\n\n```python\n'ascii' codec can't encode characters in position\n```\n\n解决方法,在脚本的头部添加如下代码\n\n```python\nimport sys\nreload(sys) \nsys.setdefaultencoding('utf-8')\n```\n\n###### 4、PHP执行Python脚本\n\n使用`exec()`方法\n\n压缩命令\n\n```bash\n\u002Fusr\u002Fbin\u002Fpython zip.py '文件目录' 'zip地址'\n```\n\n解压命令\n\n```bash\n\u002Fusr\u002Fbin\u002Fpython unzip.py 'zip地址' '文件目录'\n```\n\n易出现问题，解压时中文文件乱码，解决方法\n\n在命令的前面添加如下代码：\n\n指定编码格式\n\n```bash\nexport LC_ALL=zh_CN.UTF-8 && \n```\n\n例如\n\n```bash\nexport LC_ALL=zh_CN.UTF-8 && \u002Fusr\u002Fbin\u002Fpython zip.py '文件目录' 'zip地址'\n```\n\n",null,0,1745,"",1,"2020-08-06 14:59:05","2026-04-19 10:45:29",129,"PHP",{"id":23,"title":24},92,"PHP对图片的处理",{"id":26,"title":27},94,"客户端连接MySQL8提示 caching-sha2-password 问题",[29,31],{"id":30,"name":21},25,{"id":32,"name":33},27,"Python",2506,6,8,"https:\u002F\u002Ftp.myong.top\u002Fstorage\u002Farticle\u002F47\u002F7aaf5aeee68d3e4794a17c6d5b2eea.jpg",[39,42,47,52,57],{"id":23,"title":24,"create_time":40,"description":41},"2020-07-30 15:53:38","图片处理函数功能：缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、反色处理并保存历史记录的思路：当有图片有改动时自动生成一张新图片",{"id":43,"title":44,"create_time":45,"description":46},96,"PHP中字符串跟0做比较永远是true","2021-02-04 16:16:27","最近在项目中做数据对比的功能，发现一个特殊的情况，0跟任何字符串做比较永远返回true，特意了解了一下。",{"id":48,"title":49,"create_time":50,"description":51},13,"Win系统下配置PHP链接Oracle","2019-01-17 22:23:36","该文章内容主要介绍window系统下，php连接oracle的配置。",{"id":53,"title":54,"create_time":55,"description":56},103,"面向对象三大特性五大原则 + 低耦合高内聚[转载]","2021-10-31 23:18:58","面向对象的三大特性是\"封装、\"多态\"、\"继承\"，五大原则是\"单一职责原则\"、\"开放封闭原则\"、\"里氏替换原则\"、\"依赖倒置原则\"、\"接口分离原则\"。",{"id":58,"title":59,"create_time":60,"description":61},29,"PHP设计模式之迭代器、代理模式","2019-01-17 23:03:13","本文章讲述了php设计模式中的迭代器模式和代理模式，以及简单的应用实例",1783431656960]