python:epub檔案批量轉TXT
阿新 • • 發佈:2019-01-02
寫在前面
程式碼很菜,而且寫了很久之後才寫的筆記,程式碼裡僅包含主要函式的實現。
原因
有很多很多,大概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)