工作中使用到了解压文件,提取压缩文件,很简单python的zipfile是一个很成熟的库,没错,直接上手使用了,刚开始运行还是正常的,中间突然大批量的文件无法正常提取文件了,经过多方测试,发现是中文命名乱码导致无法正常解压,很多人说直接decode这些知识点,都无法正常解决问题,最后彻底解决问题的方法是直接执行压缩包的命令进行操作,记录代码如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
import os.path
import zipfile
import rarfile
import shutil
import win32com
import datetime
from nt import chdir
import chardet
def find_last(string,str):
last_position=-1
while True:
position=string.find(str,last_position+1)
if position==-1:
return last_position
last_position=position
#日志记录方法
def writeLog(content):
log_name = str(datetime.datetime.now().year) + "-" + str(datetime.datetime.now().month) + "-" + str(datetime.datetime.now().day) + ".txt";
# 检查今天的日志文件是否存在
fp = open("D:\\py\\pyproject\\logs\\" + log_name, 'a')
fp.write(content + "\r")
fp.close()
def winRarZip():
rar_zip_path = "D:\\officerar";
file_path = "D:\\officeunzip\\";
tmp_z_name = '';
for fn in (fns for fns in os.listdir(rar_zip_path)):
try:
print fn
print os.path.splitext(fn)[0]
file_name = os.path.splitext(fn)[0]
dest_dir = file_path+file_name
is_exist = os.path.exists(dest_dir)
if is_exist == False:
os.mkdir(dest_dir)
src_zip = 'D:\\officerar\\'+fn
for fn in (fns for fns in os.listdir(dest_dir)):
son_file_path = dest_dir+"\\"+fn
is_exist_file = os.path.exists(son_file_path)
if is_exist_file == True:
os.remove(son_file_path)
zip_command = 'WinRAR x {0} {1} -o+ -inul -iback -y'.format(src_zip,dest_dir)
if os.system(zip_command)==0:
#print 'Successful'
flag = 0
for fn in (fns for fns in os.listdir(dest_dir)):
print fn
position = find_last(fn,".")
#if(position == -1):
# writeLog(os.path.splitext(fn)[0]+"是文件夹")
#print position
extension = fn[position+1:-1]
#print extension
if extension == "ppt" or extension == "pptx" :
flag = 1
mycopyfile(dest_dir+"\\"+fn,'D:\\officepsd\\'+file_name+'.pptx')
if flag == 0:
writeLog(file_name+ "不是ppt文件")
else:
print 'FAILED'
except Exception,e:
print e
writeLog(fn+"解压异常")
continue;
if __name__ == '__main__':
print "unzip........."
winRarZip()
解决问题的方法很多,路径很多,不一定一条路找到底,zipfile确实费了很多时间,对中文就是支持不太好。