使用python批量提取docx文档中的图片

注意:此方法只能用于docx文档,doc的不行,doc的得另存为Html文件,进入到上述网页文件所在的文件夹中,你会发现有一个名称为“文件名.files”(如“图片.files”),进入其中,前面 Word 文档中的图片就一一被保存在里面了。
在解压的时候遇到点问题,1,不能解压,2,不能删除文件夹,3,不能移动文件,用try解决了
#revised by Stephen Shen 2020-3-8 19:51:46
#to extract pics from *.docx files
import zipfile
import os,shutil
import datetime
# import send2trash
# from tempfile import TemporaryDirectory

def renameFile(dstpath):
    fdirname,fbasename=os.path.split(dstpath)
    #文件名相同但大小不同
    fname,fext=os.path.splitext(fbasename)
    nowtime=datetime.datetime.now()                
    strtime=str(nowtime.year)+str(nowtime.month)+str(nowtime.day)+str(nowtime.hour)+str(nowtime.minute)
    newfbasename=fname+'-'+strtime+fext
    dstpath=os.path.join(fdirname,newfbasename)
    return dstpath

def extractPics(doc_inpath,outDir,zipDir):
    
    file_ext=['.docx']
    dirPath,fname,fext=splitPath(doc_inpath)

    if fext in file_ext:
        print(doc_inpath+' is extracting...')
        fnameNew=fname.strip()
        out_dir =os.path.join(outDir,fnameNew)
        if not os.path.exists(out_dir):#文件夹不存在
            if len(os.path.split(out_dir)[-1])>200:
                print('dirname is too long :'+out_dir)
            else:
                os.mkdir(out_dir)
        else:#文件夹已存在
            nowtime=datetime.datetime.now()                
            strtime=str(nowtime.year)+str(nowtime.month)+str(nowtime.day)+str(nowtime.hour)+str(nowtime.minute)
            out_dir=os.path.join(outDir,fnameNew+'-'+strtime)

        zip_path=os.path.join(zipDir,'docx.zip')
        shutil.copyfile(doc_inpath,zip_path)
        # zip_path=os.path.join(zip_dir,fnameNew+'.zip')
        # os.rename(copy_path,zip_path)

        try:
            with zipfile.ZipFile(zip_path,'r') as f:
                f.extractall()
        except:
            print(zip_path+' cannot be extracted')
        else:
            picsDir=os.path.join(zipDir,'word/media')

            if os.path.exists(picsDir):
                for pic in os.listdir(picsDir):
                    oldpic=os.path.join(picsDir,pic)
                    newpic=os.path.join(out_dir,pic)
                    try:
                        shutil.move(oldpic,newpic)
                    except:
                        print(doc_inpath+' is skipped')
        
        filelist=os.listdir(zipDir)                
        for f in filelist:
            filepath = os.path.join(zipDir, f )   
            if os.path.isfile(filepath):
                os.remove(filepath)
            elif os.path.isdir(filepath):
                shutil.rmtree(filepath,True)

def splitPath(doc_inpath):
    dirPath=os.path.dirname(doc_inpath)
    fname,fext=os.path.splitext(os.path.basename(doc_inpath))
    return dirPath,fname,fext

outDir=r'k:/fileExtracted/imagesFromDocs'
zipDir=r'k:/fileExtracted/zip'
# docDir=r'K:\imagsDocx'
docDir=r'K:/docs'

if not os.path.exists(outDir):
    os.makedirs(outDir)
if not os.path.exists(zipDir):
    os.makedirs(zipDir)

for folder,subFolderName,files in os.walk(docDir):

    for file in files:
        doc_inpath=os.path.join(folder,file)
        os.chdir(zipDir)
        extractPics(doc_inpath,outDir,zipDir)
        
print('done')

猜你喜欢

转载自www.cnblogs.com/dogingate/p/12524296.html