word文件批量转换为txt文档

任务:有一个父文件夹,下边有若干子文件夹,子文件夹下是若干word文件,没有其他非word文件。将父文件夹所有的word文件读取并写入指定路径下的txt文件之中。
步骤:
1.读取父文件夹下所有的子文件夹名称
2.将子文件夹下所有.docx文件分别转换为.txt文件
3.附加功能,实现文件转码。(因为word的写入doc.SaveAs()s生成的都是ANSI编码文件,可以考虑转换为utf-8编码的文件。当然也可以不转。)
4.将同一目录下所有的txt文件合并成为一个
直接上代码

#%%
#读取一个父文件夹下所有的子文件名
import os         
file_dir = r"D:\\新建文件夹\\父文件夹"
name =[]
#a=os.walk(file_dir)
for root, dirs, files in os.walk(file_dir): 
    for dir in dirs: 
        name.append(dir)
        #print(os.path.join(root, dir))  # 输出完整路径 
print(name)
#   print(root) #当前目录路径  
#   print(dirss) #当前路径下所有子目录  
#   print(files) #当前路径下所有非目录子文件 


#%%
#将一个文件夹下所有的word可读文件分别转换为txt文件
#################注意转换的都是ANSI编码,txt的合并读不了,要先换码。或者直接encoding='ANSI'############
from win32com import client as wc
import os

def get_ziwenjianjai():
    #读取一个父文件夹下所有的子文件名
    file_dir =  r"D:\\新建文件夹\\父文件夹"
    name =[]
    
    for root, dirs, files in os.walk(file_dir): 
        for dir in dirs: 
            name.append(dir)
    return name[1:]  #这里第一个文件我不需要,故扔了

    
all_FileNum = 0
def Translate(level, path):
    global all_FileNum
    '''
    将一个子文件目录下所有doc文件转成txt
    '''
    # 该目录下所有文件的名字
    files = os.listdir(path)
    for f in files:
        if (f[0] == '~' or f[0] == '.'):
            continue
        new = path + '\\' + f
        print(new)
        
        # 改成txt格式
        word = wc.Dispatch('Word.Application')  #调用word程序
        doc = word.Documents.Open(new)
        # 除去后边的.docx后缀
        #tmp = new[:-5]
        #savepath = tmp + '.txt'    #写到原文件目录下
        save= 'E:\\保存处'+ '\\' + f[:-5]
        savepath = save + '.txt'    #写到指定目录下
        doc.SaveAs(savepath, 4)  # 4代表存为txt格式

        doc.Close()
        all_FileNum = all_FileNum + 1

if __name__ == '__main__':
    zimulu=get_ziwenjianjai()
    for name in zimulu:
        mypath = 'D:\\新建文件夹\\父文件夹\\'+ name
        Translate(1, mypath)
        print('文件总数 = ', all_FileNum)



#%%
#文件编码格式转换
import os
import codecs
import chardet

def list_folders_files(path):
    """
    返回 "文件夹" 和 "文件" 名字
    :param path: "文件夹"和"文件"所在的路径
    :return:  (list_folders, list_files)
            :list_folders: 文件夹
            :list_files: 文件
    """
    list_folders = []
    list_files = []
    for file in os.listdir(path):
        file_path = os.path.join(path, file)
        if os.path.isdir(file_path):
            list_folders.append(file)
        else:
            list_files.append(file)
    return (list_folders, list_files)

def convert(file, in_enc="GBK", out_enc="UTF-8"):
    """
    该程序用于将目录下的文件从指定格式转换到指定格式,默认的是GBK转到utf-8
    :param file:    文件路径
    :param in_enc:  输入文件格式
    :param out_enc: 输出文件格式
    :return:
    """
    if in_enc is None:  #注意加入这一步可以让程序跳过该文件夹下其他不是txt格式的文本
        pass
    else:
        in_enc = in_enc.upper()
        out_enc = out_enc.upper()

        try:
            print("convert [ " + file.split('\\')[-1] + " ].....From " + in_enc + " --> " + out_enc)
            f = codecs.open(file, 'r', in_enc, "ignore")
            new_content = f.read()
            codecs.open(file, 'w', out_enc).write(new_content)
        except IOError as err:
            print("I/O error: {0}".format(err))
# 将路径下面的所有文件,从原来的格式变为UTF-8的格式
if __name__ == "__main__":
    path = r'D:\\新建文件夹\\txt整合'         #只要满足形式,一般只需改变文件夹的路径即可
    (list_folders, list_files) = list_folders_files(path)

    print("Path: " + path)
    for fileName in list_files:
        filePath = path + '\\' + fileName
        with open(filePath, "rb") as f:
            data = f.read()
            codeType = chardet.detect(data)['encoding']   # 自动获取文件编码格式
            convert(filePath, codeType, 'UTF-8')       
        
     
        
        
#%%    
#合并一个文件夹下的所有txt文件
# -*- coding: utf-8 -*-
import os
import os.path
import time
time1=time.time()

##########################合并同一个文件夹下多个txt################
def MergeTxt(filepath,outfile):

    # get .txt document
    rootdir = os.path.join(filepath)
    # read
    #with open('outfile/write.txt', 'w')as f:
    
    for dirpath, dirnames, filenames in os.walk(rootdir):
        for filename in filenames:
            if os.path.splitext(filename)[1] == '.txt':
                parent= "D:\\新建文件夹\\保存处"
                k = open(parent+outfile, 'a+',encoding='utf-8')  # 写入路径
                txtPath = os.path.join(rootdir, filename)  # txtpath就是所有txt文件的路径
                f = open(txtPath,encoding='ANSI')   # 若文件已经转为utf-8编码则写utf-8
                ##########换行写入##################
                lines= f.readlines()
                for line in lines:
                    line= line.lstrip().replace('\t','').replace(' ','') # 清洗
                    if len(line) > 15:  #长度
                        k.write(line)

                k.close()

    print("finished")
    print("输出文件路径:",filepath+outfile)
    

if __name__ == '__main__':
    filepath="D:\\新建文件夹\\待合并文件夹名"
    outfile="\\合并raw.txt"
    MergeTxt(filepath,outfile)
    time2 = time.time()
    print(u'总共耗时:' + str(time2 - time1) + 's')  

不足:
1.word的Saveas()方法与f.write()方法不同,对于存在表格的数据,word的Saveas()能将表格提取到一行,与原文较类似,但是使用f.readlines()读取再用f.write()写入之后,表格中每一个小方格的数据就变成了一行,比较难受,尚未解决。
2.如果word中有图片或者文件格式比较复杂,word会经常出现弹窗,需要手动点击弹窗的问题保证程序继续运行。
3.对于子文件夹中有其他类型的文件的情况没有完全考虑,没试过能不能运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值