python:epub文件批量转TXT

时间:2021-09-27 14:51:25

写在前面

代码很菜,而且写了很久之后才写的笔记,代码里仅包含主要函数的实现。

原因

有很多很多,大概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)