PHP执行Python脚本解压,压缩文件夹操作

PHP是有解压缩类文件的,但在实际项目中,用户方使用Python脚本压缩,很容易出现中文解压乱码,导致文件内容丢失的情况,本文主要介绍PHP执行Python脚本解压缩出现的问题以及解决方法

PHP执行Python脚本解压,压缩文件夹操作

PHP是有解压缩类文件的,但在实际项目中,用户方使用Python脚本压缩,很容易出现中文解压乱码,导致文件内容丢失的情况,本文主要介绍PHP执行Python脚本解压缩出现的问题以及解决方法

1、压缩代码
#-*- coding: utf-8 -*-
import zipfile
import os,sys
import chardet

reload(sys);
sys.setdefaultencoding('utf8')

def zip_dir(dirname, zipfilename):
    """
    | ##@函数目的: 压缩指定目录为zip文件
    | ##@参数说明:dirname为指定的目录,zipfilename为压缩后的zip文件路径
    | ##@返回值:无
    | ##@函数逻辑:
    """
    try: 
        zipfilePath = os.path.join(dirname, zipfilename)
        #先判断有没有之前的zip包
        if os.path.exists(zipfilePath):
            os.remove(zipfilePath)
        print('start zipfile!')
        filelist = []
        if os.path.isfile(dirname):
            dirname = ConvertCharSet(dirname)
            filelist.append(dirname)
        else :
            for root, dirs, files in os.walk(dirname):
                for name in files:
                    name = ConvertCharSet(name)
                    print('zipfile= '+ name)
                    filelist.append(os.path.join(root, name))

        zipfilename = ConvertCharSet(zipfilename)
        zipfilename = unicode(zipfilename, 'utf-8')
        zf = zipfile.ZipFile(zipfilename, "w", zipfile.zlib.DEFLATED)
        #zf = zipfile.ZipFile(zipfilename, "w", zipfile.ZIP_DEFLATED)
        for tar in filelist:
            tar = ConvertCharSet(tar)
            tar = unicode(tar,'utf-8')
            arcname = tar[len(dirname):]
            #print arcname
            zf.write(tar,arcname)
        zf.close()

    except Exception as ex: 
        print(ex)

def ConvertCharSet(str):
    if str:
        if isinstance(str, unicode):
            return str
        data = str
        chr_res = chardet.detect(str)
        src_enc = chr_res['encoding'].lower()
        if src_enc != 'utf-8':
            data = str.decode('gb18030').encode('utf-8')
        return data
    return ""

if __name__ == "__main__":
    i = sys.argv[1].replace("'", '')
    o = sys.argv[2].replace("'", '')
    zip_dir(i, o)
2、解压代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import zipfile,os,sys
import chardet
reload(sys) 
sys.setdefaultencoding('utf-8')

def unzip(zip_name, unzip_dir):
    try:
        #unzip_dir = unzip_dir.decode('utf-8')   # 不转码会乱码
        #zip_name = zip_name.decode('utf-8') # 不转码zipfile报错
        #zip_name = ConvertCharSet(zip_name)
        #zip_name = unicode(zip_name, 'gbk')

        #unzip_dir = ConvertCharSet(unzip_dir)
        #unzip_dir = unicode(unzip_dir, 'gbk')

        if not os.path.exists(unzip_dir):
            os.makedirs(unzip_dir, 0777)
        zfobj = zipfile.ZipFile(zip_name, 'r')

        for file_name in zfobj.namelist():
            file_name = file_name.replace('\\', '/')

            #file_name = ConvertCharSet(file_name)
            #file_name = unicode(file_name,'gbk')

            print('11: '+file_name)
            if file_name.endswith('/'):
                #try:
                #    file_name = file_name.decode('utf-8')
                #except UnicodeDecodeError:
                #    file_name = file_name.decode('gbk')
                
                print('22: ' + file_name)
                os.makedirs(os.path.join(unzip_dir, file_name), 0777)
            else:
                #try:
                #    ext_filename = os.path.join(unzip_dir, file_name.decode('utf-8'))
                #except UnicodeDecodeError:
                #    ext_filename = os.path.join(unzip_dir, file_name.decode('gbk'))

                ext_filename = os.path.join(unzip_dir, file_name)
                print('33: ' + ext_filename)
                ext_filedir = os.path.dirname(ext_filename)
                print('44: ' + ext_filedir)
                if not os.path.exists(ext_filedir):
                    os.makedirs(ext_filedir, 0777)

                data = zfobj.read(file_name)
                #print('data: '+ data)
                with open(ext_filename, 'w') as f:
                    f.write(data)
        zfobj.close()
    except Exception as ex: 
        print('55: '+ ex)

if __name__ == "__main__":
    i = sys.argv[1].replace("'", '')
    o = sys.argv[2].replace("'", '')
    unzip(i, o)
3、执行时编码问题,如下
'ascii' codec can't encode characters in position

解决方法,在脚本的头部添加如下代码

import sys
reload(sys) 
sys.setdefaultencoding('utf-8')
4、PHP执行Python脚本

使用exec()方法

压缩命令

/usr/bin/python zip.py '文件目录' 'zip地址'

解压命令

/usr/bin/python unzip.py 'zip地址' '文件目录'

易出现问题,解压时中文文件乱码,解决方法

在命令的前面添加如下代码:

指定编码格式

export LC_ALL=zh_CN.UTF-8 && 

例如

export LC_ALL=zh_CN.UTF-8 && /usr/bin/python zip.py '文件目录' 'zip地址'
上一篇:PHP对图片的处理 下一篇:客户端连接MySQL8提示 caching-sha2-password 问题

评论

评论(8)

暂无评论