1. 程式人生 > >python:epub檔案批量轉TXT

python:epub檔案批量轉TXT

寫在前面

程式碼很菜,而且寫了很久之後才寫的筆記,程式碼裡僅包含主要函式的實現。

原因

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