写在前面
代码很菜,而且写了很久之后才写的笔记,代码里仅包含主要函数的实现。
原因
有很多很多,大概8000本epub文件需要转换成TXT。没找到现成工具偷懒,就想写一段代码代工。
缺点
只对文字有效,图片类无法转化。
原理
先转换成压缩包,解压缩得到一些包含图书内容的html文件,从html标记中获取文本并保存。
* 转换成压缩包:修改文件名后缀为’.rar’
* 解压缩:使用360批量解压。作者又懒又菜,写出解压缩代码的用的时间要远远超过使用工具的时间。
* 遍历文件,生成html文件的路径
* 解析html文件,获取文本信息
* 保存成TXT
需要的代码
- 依赖的包
import os
from urllib.request import urlopen
from bs4 import BeautifulSoup
from nt import chdir
- 修改文件名后缀
##将.epub修改成.rar
def epub_rar(start):
files = os.listdir(start+'\\.')#获取当前目录下的文件
for filename in files:
portion = os.path.splitext(filename)#将文件名拆成名字和后缀
if portion[1] == ".epub":
newname = portion[0] + ".rar"
os.rename(start+'\\'+filename,start+'\\'+newname)#修改
例子:
jingxuan='E:\\BaiduYunDownload\\语料库\\精选电子书7200本合集'
starts=[]
files = os.listdir(jingxuan+'\\.')#获取当前目录下的文件
for filename in files:
starts.append(jingxuan+'\\'+filename+'\\.')
for i in starts:
epub_rar(i)
- 如果已经解压缩
##遍历文件夹,找出网页文件
def bianli(filepath):
if os.path.isfile(filepath):
if '.html'in filepath or '.xhtml' in filepath or '.htm' in filepath:
all_file.append('file:\\\\'+filepath)
else:
filelist = os.listdir(filepath)
for l in filelist:
path=os.path.join(filepath,l)
bianli(path)
return all_file
例子:
##获取所有的文本名和文本下的的文件路径
filedic={}
start = 'E:\\BaiduYunDownload\\语料库\\豆瓣高分电子书合集'
files = os.listdir(rootdir)
for i in f_list:
path = os.path.join(rootdir,i)
all_file=[]
all_file=bianli(path)
filedic[i]=all_file
*获取文本内容
#把链接转换成txt文本,依赖urlopen和bs4
def get_text(url):
html=urlopen(url)
b=BeautifulSoup(html,'lxml').text
return b
- 创建文件夹和保存文件
##创建文件夹
def mkdir(path):
folder = os.path.exists(path)
if not folder: #判断是否存在文件夹如果不存在则创建为文件夹
os.makedirs(path) #makedirs 创建文件时如果路径不存在会创建这个路径
else:
print ("--- There is this folder! ---" )
##保存文件
def save_txt(filename,text):
with open(filename,"w",encoding='utf-8') as f:
f.write(text)
例子:
##生成精选7200的类别路径
start = 'E:\\BaiduYunDownload\\语料库\\精选电子书7200本合集'
newpath='E:\\BaiduYunDownload\\语料库\\精选电子书7200本txt合集'
mkdir(newpath)
files = os.listdir(start)
##获取精选7200的类别路径,创建对应的txt文件的路径
jingxuan_f=[]
new_f=[]##存放新txt文件的路径
for i in files:
jingxuan_f.append(os.path.join(start,i))
new_f.append(os.path.join(newpath,i))
mkdir(os.path.join(newpath,i))
##转换精选电子书
for i in range(0,len(jingxuan_f)-1):
f_list = os.listdir(jingxuan_f[i])
leibiedic={}
for f in f_list:
path = os.path.join(jingxuan_f[i],f)
all_file=[]
all_file=bianli(path)
leibiedic[f]=all_file
for name in leibiedic:
try:
textname=new_f[i]+'\\'+name+'.txt'
result=''
for url in leibiedic[name]:
url=str(url)
text=get_text(url)
result=result+text
except:
print(name)
continue
save_txt(textname,result)
- 把压缩文件删除
##遍历删除.rar文件
def bianlidel(filepath):
if os.path.isfile(filepath):
if '.rar'in filepath:
os.remove(filepath)
else:
filelist = os.listdir(filepath)
for l in filelist:
path=os.path.join(filepath,l)
bianlidel(path)