任务:有一个父文件夹,下边有若干子文件夹,子文件夹下是若干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.对于子文件夹中有其他类型的文件的情况没有完全考虑,没试过能不能运行。