2022年9月28日 星期三

只要點兩下,就能寄送全班個人成績單

        最近段考剛過,又要通知家長學生成績。原本讓學生寫聯絡簿,然後將紙本成績單貼上聯絡簿,家長在聯絡簿與紙本成績單上簽名,導師批閱聯絡簿與紙本成績單就可以知道家長是否知情。但是,學生會仿冒家長簽名或拿家長的印章蓋章,阻止家長得知成績。老師必須要比對筆跡,才能知道學生是否仿冒家長簽名。
        由於法規限制,家長只能收到自己孩子的成績,不能知道班上其他學生的成績。老師會從學校方面取得紙本全班成績單或從雲端校務系統下載電子全班成績單。換言之,老師要讓家長知道自己孩子的成績,就得對紙本全班成績單做處理,將之一一切割成紙本個人成績單。或是重新整理電子全班成績單,將之複製貼上到個人成績單。總之,這是一項大工程。
        是否能夠開發程式,讓老師只要點兩下就能夠建立全班個人成績單。接下來,點兩下就能夠將個人成績單一一發送到家長電子信箱。
        最後完成程式:
下載檔案。解壓密碼:demo1234
教學影片:


        以下是使用教學,共有五個步驟:
一.若沒有Gmail,請先建立自己的Gmail
二.下載程式與解壓縮
三.設定寄件者電郵與密碼
四.自雲端校務系統下載report.xlsx
五.對著01建立學生成績PDF_PyScroeTablePdf.exe點兩下
六.對著02批次寄電郵給家長_PythonGmail.exe點兩下
        
        依序如下:
一.若沒有Gmail,請先建立自己的Gmail
        一次設定




二.下載程式與解壓縮
      解壓縮時,要注意:不能破壞資料夾結構。





.設定寄件者電郵與密碼
        一次設定
        程式預設使用Gmail。若沒有Gmail,請建立Gmail。
        設定兩步驟驗證


        設定 應用程式密碼



.自雲端校務系統下載report.xlsx

.對著01建立學生成績PDF_PyScroeTablePdf.exe點兩下

.對著02批次寄電郵給家長_PythonGmail.exe點兩下

程式設計部分:
程式目的:讀取report.xlsx 並整理全班學生成績匯出學生個人成績.pdf  到 附件資料夾
檔案名稱:PyScroeTablePdf.py
檔案內容:
import os
import openpyxl as opxl
from win32com.client import DispatchEx

class StudentDataDict():
    def __init__(self,FileName):
        self.FileName = FileName

    def StudentData(self):
        #取得學生成績資料
        wb = opxl.load_workbook(self.FileName)
        wbsh = wb['Worksheet']
        StudentDataDict = dict()
        ScoreName = wbsh.cell(1,1).value
        StudentDataDict[1] = ScoreName
        SubjectNameList = []
       
        for i in range(1,wbsh.max_column+1):
            SubjectNameList.append(wbsh.cell(2,i).value)
        StudentDataDict[2] = SubjectNameList
       
        for j in range(3,wbsh.max_row+1):
            StudentDataList = []
            for i in range(1,wbsh.max_column+1):
                StudentDataList.append(wbsh.cell(j,i).value)
            StudentDataDict[j] = StudentDataList

        return StudentDataDict

class ScoreTablePdf():
    def __init__(self,StudentData):
        self.StudentData = StudentData

    def RecipientData(self):
        #建立收件者資料
        RecipientFile = str(os.path.abspath(os.getcwd()))+'\\收件者資料.xlsx'
        TempStudentData = self.StudentData
        if not os.path.exists(RecipientFile):
            print("建立收件者資料.xlsx.......")
            #收件者資料.xlsx不存在,則自動建立收件者資料.xlsx
            TempExcelFile = opxl.Workbook()
            TempExcelFileSheet = TempExcelFile.active
            TitleName = ['年班座號','學生姓名','家長姓名','家長電郵','附件名稱','附件副檔名']
            for i in range(0,len(TitleName)):
                TempExcelFileSheet.cell(row=1,column=i+1).value = TitleName[i]
            for j in range(0,len(TempStudentData)):
                TempExcelFileSheet.cell(row=j+2,column=1).value = TempStudentData[j+3][0]+str(TempStudentData[j+3][1]).zfill(2)
                TempExcelFileSheet.cell(row=j+2,column=2).value = TempStudentData[j+3][3]
                TempExcelFileSheet.cell(row=j+2,column=5).value = TempExcelFileSheet.cell(row=j+2,column=1).value
                TempExcelFileSheet.cell(row=j+2,column=6).value = 'pdf'
            TempExcelFile.save(RecipientFile)    
            print("建立收件者資料.xlxs OK")
           
    def ScoreTable(self):
        TempPath = str(os.path.abspath(os.getcwd()))+'\\Temp\\'
        if not os.path.isdir(TempPath):
            os.mkdir(TempPath)
        AttachPath = str(os.path.abspath(os.getcwd()))+'\\附件\\'
        if not os.path.isdir(AttachPath):
            os.mkdir(AttachPath)
        TempStudentData = self.StudentData    
        TableSubject = self.StudentData[1]
        TempStudentData.pop(1)
        TestSubject = self.StudentData[2]
        TempStudentData.pop(2)
        for i in TempStudentData:
            ExcelWorkBook = opxl.Workbook()
            ExcelSheet = ExcelWorkBook.worksheets[0]
            ExcelSheet['A1'] = TableSubject
            for j in range(1,len(TestSubject)):
                ExcelSheet.cell(row=j+1,column=1).value = TestSubject[j]
                ExcelSheet.cell(row=j+1,column=2).value = TempStudentData[i][j]
            ExcelFileName = TempStudentData[i][0]+str(TempStudentData[i][1]).zfill(2)+".xlsx"    
            ExcelWorkBook.save(TempPath+ExcelFileName)
            PdfFileName = TempStudentData[i][0]+str(TempStudentData[i][1]).zfill(2)+".pdf"    
            TempExcelApplication = DispatchEx("Excel.Application")
            TempExcelApplication.Visible = False
            TempExcelApplication.DisplayAlerts = 0
            TempBooks = TempExcelApplication.Workbooks.Open(TempPath+ExcelFileName,False)
            TempBooks.ExportAsFixedFormat(0,AttachPath+PdfFileName)
            TempBooks.Close(False)
            print("建立學生 "+PdfFileName+" 成績單...OK")
            os.remove(TempPath+ExcelFileName)
        os.removedirs(TempPath)
       

print("取得report.xlsx 資料....")
pep01 = StudentDataDict('report.xlsx').StudentData()
print("取得report.xlsx 資料OK")
print("建立全班學生個人成績單.....")
ScoreTablePdf(pep01).ScoreTable()
print("建立全班學生個人成績單OK")
ScoreTablePdf(pep01).RecipientData()
os.system("pause")
os.system("exit")

程式設計部分:
程式目的:將附件內的學生個人成績.pdf 依著收件者資料.xlsx 一一寄給家長
檔案名稱:PythonGmail.py
檔案內容:
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
from email.mime.image import MIMEImage
from pathlib import Path
from email.mime.application import MIMEApplication
import os
import openpyxl as opxl

           
class EmailOpenFiles():
    #開啟檔案
   
    def __init__(self,DirectoryName,FileName):
        self.DirectoryName = DirectoryName
        self.FileName = FileName

    def AttachFiles(self):
        #取得附件資料夾內所有檔案名稱並回傳List
        AttachDirPath=str(os.path.abspath(os.getcwd()))+'\\'+self.DirectoryName+'\\'
        AttachFileNameList = os.listdir(AttachDirPath)
        return AttachFileNameList
   
    def EmailFileContent(self):
        #設定信件內容檔名並取得檔案內容並回傳List
        EmailContentFileName = str(os.path.abspath(os.getcwd()))+"\\"+self.FileName
        EmailContentFile = open(EmailContentFileName,'r')
        EmailContentList = EmailContentFile.readlines()
        EmailContentFile.close()
        return EmailContentList
   
    def AttachDirPath(self):
        #取得附件資料夾路徑
        AttachDirPath=str(os.path.abspath(os.getcwd()))+'\\'+self.DirectoryName+'\\'
        return AttachDirPath
   
    def AttachExcelOpen(self):
        #打開附件為Excel檔案並回傳List
        AttachExcelFileName = str(os.path.abspath(os.getcwd()))+"\\"+self.FileName
        TempExcelWorkBook = opxl.load_workbook(AttachExcelFileName)
        TempMax_Row = TempExcelWorkBook.worksheets[0].max_row
        TempMax_Column = TempExcelWorkBook.worksheets[0].max_column
        TempReturnList = []
        for i in range(1,TempMax_Row+1):
            TempList = []
            for j in range(1,TempMax_Column+1):
                TempList.append(TempExcelWorkBook.worksheets[0].cell(i,j).value)
            TempReturnList.append(TempList)
        return TempReturnList



class PythonGmail():
    def __init__(self,EmailSubject,EmailFrom,EmailTo,EmailContent,EmailAttachments,EmailSender,EmailPass):
        self.EmailSubject = EmailSubject
        self.EmailFrom = EmailFrom
        self.EmailTo = EmailTo
        self.EmailContent = EmailContent
        self.EmailAttachments = EmailAttachments
        self.EmailSender = EmailSender
        self.EmailPass = EmailPass
   
    def PythonGmail(self):
        #建立MIMEMMultipart物件
        content = MIMEMultipart()
        #郵件標題
        content["subject"] = self.EmailSubject
        #寄件者Email
        content["from"] = self.EmailFrom
        #收件者Email
        content["to"] = self.EmailTo
        #郵件內容
        content.attach(MIMEText(self.EmailContent))
       
        #附件寄送檔案
        AttachFileName = self.EmailAttachments
        AttachFileload = MIMEApplication(open(AttachFileName,'rb').read())
        AttachFileload.add_header('Content-Disposition','attachment',filename=AttachFileName)
        content.attach(AttachFileload)
       
        #設定SMTP伺服器
        with smtplib.SMTP(host="smtp.gmail.com",port="587") as smtp:
            try:
                #驗證SMTP伺服器
                smtp.ehlo()
                #建立加密傳輸
                smtp.starttls()
                #登入寄件者Gmail
                #smtp.login("寄件者信箱","寄件者密碼")
                smtp.login(self.EmailSender,self.EmailPass)
                #寄送郵件
                smtp.send_message(content)
                #顯示訊息
                return "Success! Send OK!"
            except Exception as e:
                return "Error message:"+str(e)

#取得附件資料夾內所有檔案名稱
EmailAttachments = EmailOpenFiles('附件','').AttachFiles()
#取得附件資料夾的絕對路徑
EmailAttachDirPath = EmailOpenFiles('附件','').AttachDirPath()

#取得信件標題檔案內容並存成信件標題list
EmailSubjectlist = EmailOpenFiles('','信件標題.txt').EmailFileContent()
#從信件標題list取得信件標題字串
EmailSubject = EmailSubjectlist[0]

#取得信件內容檔案內容並存成信件內容list
EmailContentlist = EmailOpenFiles('','信件內文.txt').EmailFileContent()
#從信件內容list取得信件內容字串
EmailContent = ""
for i in EmailContentlist:
    EmailContent = EmailContent + i

#從寄件者電郵與密碼.txt取得List
EmailSenderAddrList = EmailOpenFiles('','寄件者電郵與密碼.txt').EmailFileContent()
#去除List[0]標題
EmailSenderAddrList.pop(0)
#取得寄信者email與密碼
EmailSender,EmailPass = EmailSenderAddrList[0].split(',')

#從收件者資料.xlsx 取得List
EmailToList = EmailOpenFiles('','收件者資料.xlsx').AttachExcelOpen()
#去除List[0]標題
EmailToList.pop(0)
#取得收件者資料並逐一寄信
for i in EmailToList:
    A1,A2,A3,A4,A5,A6 = i
    EmailAttachFileName=EmailAttachDirPath+A5+'.'+A6
    EmailTest=PythonGmail(EmailSubject,EmailSender,A4,EmailContent,EmailAttachFileName,EmailSender,EmailPass).PythonGmail()
    print(A1+" "+A2+" Email "+ EmailTest)

os.system("pause")
os.system("exit")



資料來源:
1.Python實現Gmail客製化信件大量發送 — 【基礎篇】
2.Python 初學第十二講—檔案處理
3.Python split 字串分割用法與範例




2022年9月27日 星期二

APPLE IPAD 管理與派送APP 筆記

一、觀念:
1.行動裝置管理MDM
Mobile Device Management
 
2.Apple 學校管理 ASM(購買APP)
Apple School Manager
 
3.Jamf pro (管理IPAD與派送APP) 
學校不用架設伺服器來管理IPAD
管理網址:https://twmoechc學校教育部代碼.jamfcloud.com

二、購買APP並派送到IPAD
1.購買APP
   輸入之後,第一次需要做手機認證。
   注意事項:廠商會協助辦理,但資料須由學校承辦人填寫。
   登入之後,選App
   以Line為例,
 
2.Jamf pro 將App派送到IPAD:
管理網址:https://twmoechc學校教育部代碼.jamfcloud.com
 注意事項:帳密忘記->詢問廠商。
 

 

 
 

 
 
 


2022年9月15日 星期四

如何跨年度,持續使用二林國小紀明村老師的運動會競賽檢錄系統

整理:
1.只要會用滑鼠點兩下,用shell 在 ubuntu 16.04 x64 桌面版本快速安裝 運動檢錄系統
https://skjhcreator.blogspot.com/2021/03/shell-ubuntu-1604-x64.html
2.紀明村老師運動會競賽檢錄系統更新模組_學生帳號管理模組
https://skjhcreator.blogspot.com/2021/03/blog-post.html
3.二林國小紀明村老師的二林網管 PDO + SQLite 程式寫作工具箱2014.07
https://skjhcreator.blogspot.com/2021/03/pdo-sqlite-201407.html
4.用shell 在CentOS 7 minimal 64位元 安裝 紀明村老師的運動會檢錄系統
https://skjhcreator.blogspot.com/2021/02/shell-centos-7-minimal-64.html
5.紀明村老師的運動檢錄系統程式碼研究心得(一)介接CloudSchool與mysql資料庫
https://skjhcreator.blogspot.com/2021/03/cloudschoolmysql.html
6.紀明村老師運動檢錄系統程式碼研究心得(二)登入login登出logout與使用者認證
https://skjhcreator.blogspot.com/2021/02/loginlogout.html
7.紀明村老師運動檢錄系統程式碼研究心得(三)smarty
https://skjhcreator.blogspot.com/2021/02/smarty.html


        感恩二林國小紀明村老師開發運動檢錄系統
第一版Sport1090730.zip
        感恩二林國小紀明村老師提供解答
        又到了新學年的第一個學期,每當這個時候,體育組就要開始籌備運動會相關事宜。但是問題來了,去年運動會已經建置好運動會競賽檢錄系統。那今年運動會競賽檢錄系統更新事宜要怎麼做?現在打開運動會競賽檢錄系統,資料還是去年的。要怎麼做,才能更新資料庫?
環境介紹:
          (1)系統建置在 CentOS 裡 /var/www/html/Sport109/
          (2)資料庫位置 /var/www/Sport_data/

更新資料庫的做法:
1.修改/var/www/html/Sport109/109.conf.php 
   將原先的 $DB='sport109.sqlite3'; 加上註解 //
   另外新增$DB='sport2022.sqlite3';
   如下圖:

2.重新自雲端校務系統抓取資料:
在瀏覽器上網址打上: https://伺服器IP/Sport109/easy.php
就會看到

按下上圖中紅色箭頭所指處<<按下後開始>>。如下圖,就可以看到資料庫已經更新了。

2022年8月11日 星期四

利用微軟VHD,讓總務處出納組的新電腦掛載舊電腦的出納系統與相關設定

        最近遇到一個問題,總務處出納組的電腦故障,需要新添購主機。但是出納組的電腦內有出納系統,由於年代久遠,沒人知道如何安裝新的出納系統。只有厚厚的安裝說明書、原始安裝程式與一大堆的更新程式,而更新程式需按照順序一個一個地裝。更離奇的是販售出納系統的公司倒了,以後不會有更新程式,也不會派出工程師來協助安裝。而出納組再過幾年就要退休,也無力再學新的出納系統。出納組希望能夠使用舊有的出納系統。問題是電腦壞了,壞的是主機板。該類型的主機板也停產了。用不同的晶片的主機板,系統需要重灌。重灌後的作業系統需要重新安裝出納系統,相關的資料需要重新建置。但問題是販售出納系統的公司倒了,不會有工程師來協助安裝。買新的出納系統,出納組需要重新適應新的出納系統。問題是出納組快退休了,無心也無力學新的出納系統。那該怎麼辦?有什麼是資訊組可以協助?
        現在將上述文字整理三大重點:
1.總務處出納組電腦故障,故障原因為主機板故障,沒有同類型的主機板可更換。
2.出納系統無法重新安裝,因販售出納系統的公司倒閉,無法派工程師協助安裝。
3.出納組長因屆退,無心力操作新出納系統。
面對這樣難題,資訊組可以做什麼來解決問題?
        從閱讀資料來源01~14,資訊組發現可以利用VHD,將出納組的硬碟轉成VHD。再利用微軟VHD技術,掛載在新電腦。將新電腦重開機,進入VHD中。直接在VHD操作原先的出納系統。那問題來了,如何將硬碟轉成VHD?

1.如何將硬碟轉成VHD?
   (1)到 https://www.starwindsoftware.com/starwind-v2v-converter#download下載StarWind V2V Converter,完成其要求,即可下載。下載後進行安裝。


   (2)利用快捷線與StarWind V2V Converter將硬碟轉成VHD,並將轉好的VHD改名w7x64.vhd(名稱可自行更改)








   (3)將w7x64.vhd 放入新主機的D碟中,並以系統管理員身分開啟[命令提示字元]
   (4)輸入下列指令:
#D:
#bcdedit /copy {current} /d "w7x64"
已順利將項目複製到 {29489e95-17ba-11ed-8c3f-9fa07dfd0bac}
#bcdedit /set {29489e95-17ba-11ed-8c3f-9fa07dfd0bac} device vhd=[D:]\w7x64.vhd
#bcdedit /set {29489e95-17ba-11ed-8c3f-9fa07dfd0bac} osdevice vhd=[D:]\w7x64.vhd
#bcdedit /set {29489e95-17ba-11ed-8c3f-9fa07dfd0bac} detecthal on
#shutdown /r /f  /t 0 
   (5)重開機後,請選擇w7x64:

注意事項:
1.需在BIOS 啟用 Intel Virtualization Technology
2.

程式下載
https://www.starwindsoftware.com/starwind-v2v-converter#download




2022年7月18日 星期一

如何在離線狀態下,利用Windows電腦測試HOST內VM的Aapache2 多個網站(多網域)設定

        最近要在Ubuntu的Apache 架Django網站,希望能夠在Windows主機內的虛擬機上測試。其架構圖如下:
        那我要如何如何在離線狀態下,利用Windows電腦測試HOST內VM的Aapache2 多個網站(多網域)設定?
在連接網路的情況下,需完成下列事項:
        一、VMware安裝虛擬機Ubuntu20.04
        二、在Ubuntu 20.04安裝 Apache2
接下來,請拔除Windows 主機的網路線
        三、設定Windows 電腦的hosts
        四、開啟瀏覽器進行測試

        在連接網路的情況下,需完成下列事項:
        一、VMware安裝虛擬機Ubuntu20.04

        二、在Ubuntu 20.04安裝 Apache2
                00.確認IP
                $ip a
                此時IP為192.168.181.144

                01.更新與安裝Apache2
                $sudo apt update && sudo apt install apache2

                02.測試Apache2是否安裝成功
                $sudo service apache2 status

                03.在 /var/www/ 建立兩個網域資料夾 test01.com.tw 與 test02.com.tw
                $sudo mkdir -p /var/www/test01.com.tw/
                $sudo mkdir -p /var/www/test02.com.tw/

                04.分別在兩個網域資料夾 test01.com.tw 與 test02.com.tw下建立資料夾html
                $sudo mkdir -p /var/www/test01.com.tw/html
                $sudo mkdir -p /var/www/test02.com.tw/html

                05.修改  /var/www 及其內容權限
                $sudo chmod -R 755 /var/www 

                06.分別在資料夾html 建立index.html
                $sudo nano /var/www/test01.com.tw/html/index.html
                其內容為
                <html>
                   <head>
                     <title>test01.com.tw</title>
                   </head>
                   <body>
                      <h1>test01.com.tw</h2>
                   </body>
                </html>

                $sudo nano /var/www/test02.com.tw/html/index.html
                其內容為
                <html>
                   <head>
                     <title>test02.com.tw</title>
                   </head>
                   <body>
                      <h1>test02.com.tw</h2>
                   </body>
                </html>

                07.在/etc/apache2/sites-available中建立虛擬主機文件(Virtual Host Files)
                $sudo nano /etc/apache2/sites-available/test01.com.tw.conf
                其內容為
                <VirtualHost *:80>
                    ServerAdmin webadmin@test01.com.tw
                    ServerName test01.com.tw
                    ServerAlias www.test01.com.tw
                    DocumentRoot /var/www/test01.com.tw/html
                    ErrorLog ${APACHE_LOG_DIR}/error.log
                    CustomLog ${APACHE_LOG_DIR}/access.log combined
                </VirtualHost>

                $sudo nano /etc/apache2/sites-available/test02.com.tw.conf
                其內容為
                <VirtualHost *:80>
                    ServerAdmin webadmin@test02.com.tw
                    ServerName test02.com.tw
                    ServerAlias www.test02.com.tw
                    DocumentRoot /var/www/test02.com.tw/html
                    ErrorLog ${APACHE_LOG_DIR}/error.log
                    CustomLog ${APACHE_LOG_DIR}/access.log combined
                </VirtualHost>

                08.啟用新的虛擬主機文件(Virtual Host Files)
                $sudo a2ensite test01.com.tw
                $sudo a2ensite test02.com.tw

                09.檢查設定語法是否有問題
                $apachectl configtest

                10.重啟Apache2
                $sudo systemctl reload apache2

接下來,請拔除Windows 主機的網路線
三、設定Windows 電腦的hosts
        在 C:\WINDOWS\system32\drivers\etc 內,有個hosts。
        請將
        192.168.181.144 test01.com.tw
        192.168.181.144 test02.com.tw
        加入 hosts,如下圖:

四、開啟瀏覽器進行測試
        分別在瀏覽器網址輸入 test01.com.tw 與 test02.com.tw,即可看到


2022年7月11日 星期一

回答問題:將程式碼中 zh 改成 en 與測試文字稿改成英文,會不會有問題?

系列文章:

        由於網友提出問題。我將其截圖如下:
這讓我很好奇,到底是哪出了問題。於是,我將程式碼由 zh 改成 en。然後將測試文字檔改為英文。然後將修改後的程式碼編譯成EXE,方便使用。
       測試結果:
發現沒有問題。我的測試環境為作業系統:Windows 10 64位元 Python 版本:3.9.0。 那接下來可能是版本問題。
       最後完成程式:
下載檔案。解壓密碼:demo1234
教學影片:
       以下是程式原始碼的內容:
程式目的:讀取Txt.txt 將之轉成merge.mp3
程式名稱:Txt2Mp3Python.py
程式內容:
from gtts import gTTS
import os

mp3_path=str(os.path.abspath(os.getcwd()))+'\\mp3\\'
i = 0
merge_file = list()
# 一行一行地讀取Txt.txt,轉成 001.mp3 002.mp3 003.mp3 ...
TxtFileName = 'Txt.txt'
with open(TxtFileName) as f:
    for line in f.readlines():
        i=i+1
        myobj = gTTS(text=line, lang='en', slow=True)
        myobj.save(mp3_path+str(i).zfill(3)+'.mp3')
        merge_file.append(mp3_path+str(i).zfill(3)+'.mp3')

merge_file_mp3 = list()
# mp3資料夾內mp3 合併成 merge.mp3
for j in merge_file:
    with open(j,'rb') as f:
        merge_file_mp3.append(f.read())

with open('merge.mp3','wb') as f:
    for j in merge_file_mp3:
        f.write(j)

文字稿名稱:Txt.txt
文字稿內容:
  Good afternoon,ladies and gentlemen!
  I’m very honored to stand here and give you a short speech! To begin with ,I want to ask a question .Does everybody dream a good dream last night Actually ,today I want to talk about dream with you. Of course, What I want to talk is not a dream you have last night,but a dream—— about life.
  Everyone has dreams about life, different dreams at different life stage,and we need dreams to support us. Dreams are like the stars we never reach in the sky,but like most mariners,we can chart our course by them. With the dream,we have a direction,with a direction, we were no longer confused.With the dream, there is hope,With hope, we have the strength to fight.
  But I know,life is tough,and there are always ups and downs, maybe we fail in the way to our aims,and we may feel depressed ,whenever at this time, the dream in our heart can always comfort us, encourage us ,and support us to move ahead.

資料來源:

文字檔資料來源:

2022年7月7日 星期四

python 只要點兩下,就可以利用同學的重點整理文字稿製作有聲書(讀取TXT文字轉成mp3)


        最近要考試,希望能得到好成績。但是自己沒時間靜下心來好好閱讀,希望自己能夠善用時間,在公車、火車上用[聽],自己跟著聲音將書中的重點念出來。目前同學已經將書中重點整理成文字電子檔,但是聲音要怎麼出來。有兩種方法:1.傳統方法 2.程快速方法。其中
1.傳統方法:
    所需設備:錄音機:一台、文字稿:一份、人:一個
            方式:人照著文字稿一字一句唸出聲音,錄音機將聲音錄起來。
            缺點:耗時
            優點:聲音非常有感情
2.快速方法:
    所需設備:電腦:一台、文字稿:一份
            方法:電腦將文字稿轉成mp3
            優點:省時
            缺點:聲音沒有感情
        這兩種方法當然各有利弊。現在要針對同學整理重點文字電子稿,快速做出mp3。讓自己在車上反覆聽,將知識隨著自己耳聽口說融入腦海中。
       最後完成程式:
下載檔案。解壓密碼:demo1234
教學影片:

        以下是程式原始碼的內容:
程式目的:讀取Txt.txt 將之轉成merge.mp3
程式名稱:Txt2Mp3Python.py
程式內容:
from gtts import gTTS
import os

mp3_path=str(os.path.abspath(os.getcwd()))+'\\mp3\\'
i = 0
merge_file = list()
# 一行一行地讀取Txt.txt,轉成 001.mp3 002.mp3 003.mp3 ...
TxtFileName = 'Txt.txt'
with open(TxtFileName) as f:
    for line in f.readlines():
        i=i+1
        myobj = gTTS(text=line, lang='zh', slow=True)
        myobj.save(mp3_path+str(i).zfill(3)+'.mp3')
        merge_file.append(mp3_path+str(i).zfill(3)+'.mp3')

merge_file_mp3 = list()
# mp3資料夾內mp3 合併成 merge.mp3
for j in merge_file:
    with open(j,'rb') as f:
        merge_file_mp3.append(f.read())

with open('merge.mp3','wb') as f:
    for j in merge_file_mp3:
        f.write(j)


文字稿名稱:Txt.txt
文字稿內容:
    誠信,如同一輪明月普照大地,以它的清輝驅盡人間的陰影;誠信如一束玫瑰的芬芳,能打動有情人的心。無論時空如何變幻,都閃爍著誘人的光芒。有了她,生活就有了芬芳,有了她,人生就有了追求!
    它掌握在人手上,會讓太多的是是非非,太多的流言蜚語,頓時暗淡,進而煙消雲散它們失去了存在的理由。它平凡而又高深,簡單而又複雜,於是,上帝讓它擔負起了開啟成功之門的重任,可曾有多少人懷疑它被藏在了天使的翅膀里,他們總是仰望天空去尋找它,卻不知它就在地上,就在每個人身邊,只不過有人把它看作是一種裝飾品罷了。
    從古時起,金鑰匙便散布在人間的每個角落並早被古人意識著。有人不屑;有人追求;有人成功。還有古語為證:成在學、思、行,行在誠、實、信、車無轅不行,人無信不立、有德有才者,謂之君子;有德無才者,謂之賢人;有才無德者,謂之小人。上述三句古言也反映了誠信、成人、成才的關係。其中成在學、思、行,行在誠、實、信就已經高度概括了誠信、成人、成才的關係,誠信是基礎,然後才談得上探索如何成人與成才。
    要注意才不等於財,誠信與財富無關但誠信遠比財富重要。有的人富了,反而離誠信遠了,離平庸近了;有的人很窮,卻擁有了誠信,且無處不在。誠信需要用互動來維持,它是有回報的,然而誠信又並非簡單地視為感情投資,它並不是要你稍微有了一點資本以後,你就可以讓別人誠信於你,而不是你對別人誠信。人的一生就是在相信別人和讓別人相信自己中度過的。從相信別人到相信自己彷彿更是順風順水的事。由此綜觀中國歷史,誠信曾引出了多少時代驕子。
    大家有沒有想過,沒有誠信,這個世界會是什麼樣子呢。孩子說謊、朋友違約、貪官吟喔不決、奸商東遊西盪,到處充滿爾虞我詐,勾心鬥角。人人都生活在欺騙的面具下面,你的眼睛還可以相信誰呢。料是誰都會一籌莫展,終日人心惶惶,那活在世間又能得到什麼樂趣呢。人類文明又怎能前進呢。一個言而無信的人,他又怎能保住人格的最低限度。此類人繁衍凝聚成的又是怎樣的一種族魂、國格呢。長此下去,人類文明將停滯不前。有誰還想重複國王新衣的故事呢。還是這話說得好:要使社會上所有人都講誠信,那未免過於天真,而若連講誠信的人都找不出,那又未免過於墮落。
    誠信是另類的大樹,濃郁挺拔,無論雨有多大,它都始終婆娑搖曳著。誠信是一面鮮明的旗幟,迎風搖曳,無論風有多烈,它都始終隨風舞動著。


資料來源:

文字稿資料來源:


只要點兩下就能將 彰化縣EIP系統全校學生帳號總表 依 各班級 分成 各班級學生帳號總表

系列文章: 1. 只要點兩下就能產出彰化縣Cloud School 學生帳號密碼匯入彰化縣EIP系統學生帳號密碼的CSV 1. https://skjhcreator.blogspot.com/2025/08/cloud-school-eipcsv.html 2. 只要點兩下就能...