用python写一个文本阅读器

作者: bigtrace | 来源:发表于2017-07-29 03:18 被阅读287次

    现在无论在电脑上还是手机端阅读txt的小说非常方便,比如下载一个QQ阅读之类的软件就可以实现书签和翻页功能, 那么如何用python来实现同样的功能呢,我觉得这是一个非常实用并且可以锻炼我们的编程能力的小练习。

    我先抛砖引玉,写一个简单的文本阅读器。

    进入程序

    如果第一次使用,请打开新的txt文件

    输入n, 来预览该文件夹内存放的txt文件

    n

    接着输入txt文件名,

    比如侠客行

    翻页

    直接输入回车,便可实现翻页。

    结束阅读并保存当前页为书签

    输入 s 存入书签,

    s

    程序提示是否结束阅读,如果是则输入回车,否则输入任意字符,继续浏览。

    如果第一次创建书签,程序会创建一个bookmark.txt 的文件,并将书签保存在其中

    直接结束阅读

    输入b 则会阅读结束阅读,并且不保存当前页为书签。

    浏览书签历史

    输入v 程序会打开bookmark.txt的文件,浏览所有保存过的书签历史

    v

    接着输入书签 index来跳转至该书签。

    直接继续最近一次阅读

    如果直接输入 c 可以自动从最新的书签记录处开始,直接继续最近一次阅读。

    结束程序

    输入e 来终止程序

    程序本身并不复杂,由于我用的是python2, 对于如何处理中文编码是一个很好的练习。

    Code:

    
    # coding=utf-8
    
    
    import os
    import os.path
    import argparse
    import sys
    import datetime
    import time
    import random
    from os.path import getsize
    from StringIO import StringIO
    import json
    from pprint import pprint
    import re
    import codecs
    
    
    
    class Reader:
    
    
        def __init__(self):
            os.system('cls')
            self.load_bookmark()
            print """
    
     _       __     __                             __           ______     __     ____                 __         
    | |     / /__  / /________  ____ ___  ___     / /_____     /_  __/  __/ /_   / __ \___  ____ _____/ /__  _____
    | | /| / / _ \/ / ___/ __ \/ __ `__ \/ _ \   / __/ __ \     / / | |/_/ __/  / /_/ / _ \/ __ `/ __  / _ \/ ___/
    | |/ |/ /  __/ / /__/ /_/ / / / / / /  __/  / /_/ /_/ /    / / _>  </ /_   / _, _/  __/ /_/ / /_/ /  __/ /    
    |__/|__/\___/_/\___/\____/_/ /_/ /_/\___/   \__/\____/    /_/ /_/|_|\__/  /_/ |_|\___/\__,_/\__,_/\___/_/     
                                                                                                                  
    
                    """
    
    
        def Read_txt(self,Use_bm):
            
    
            if Use_bm ==True:
                self.text_name=self.bm[1]
                self.last_page_num=self.bm[3]
                print "\nWelcome back to "+ self.text_name +".txt" +"  --last time read at ["+self.bm[2]+"]  --read from page " +self.bm[3] +"\n"
    
            else:
                which_text = raw_input('Input your new text name: \n')
                self.text_name=which_text
                self.last_page_num=0
                print "\nNow, you are reading " + self.text_name +".txt" +"\n"
    
    
    
            i =0
            with codecs.open(self.text_name+".txt", encoding="utf-8") as g:
                line_text = g.readlines()
    
            g.close()
            for l in line_text:
                if i>=int(self.last_page_num)-8:
    
                    
                    print l.encode("gb18030")
                    if i%9 ==0:
                        print "------------------"
                        next = raw_input( '\n')
                        if next =="c":
                            os.system('cls')
                            
                        elif next=="s":
                            
                            print "--saved to your bookmark"
                            
                            bk = codecs.open("bookmark.txt", "a", "utf-8")
                            if Use_bm==True:
                                bm_= "["+self.text_name+"]  ["+ datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") +"]  ["+str(i) +"]\n"
                            else:
                                bm_= "["+self.text_name.decode("gb18030")+"]  ["+ datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") +"]  ["+str(i) +"]\n"
    
                            
                            bk.write(bm_)
                            bk.close()
                            next = raw_input( 'exit?\n')
                            if next =="":
                                os.system('cls')
                                break
    
    
    
                        elif next =="b":
                            os.system('cls')
                            break
                        elif next =="h":
                            print """
                            type those commands
    
                            Enter - next page
                            s - save and exit
                            b - exit without save
    
                            """
    
                i=i+1
    
    
    
    
    
    
    
        def load_bookmark(self):
            if os.path.isfile("bookmark.txt"):
                self.bm_file_exist= True
    
                with codecs.open("bookmark.txt", encoding="utf-8") as bm:
                    line_bm = bm.readlines()
                self.bm_list= []
                bm.close()
                index=0
                for each_bm in reversed(line_bm):
        
                    text_name = re.search(r"\[(.*)\]\s+\[(.*)\]\s+\[(\d*)\]", each_bm).group(1)
                    bm_date_time = re.search(r"\[(.*)\]\s+\[(.*)\]\s+\[(\d*)\]", each_bm).group(2)
                    page_num = re.search(r"\[(.*)\]\s+\[(.*)\]\s+\[(\d*)\]", each_bm).group(3)
                    self.bm_list.append([index,text_name,bm_date_time,page_num])
                    index=index+1
            else:
                self.bm_file_exist= False
    
    
        def choose_bookmark(self,Use_default_bm):
            self.load_bookmark()
            
            if Use_default_bm== True:
                self.bm=self.bm_list[0]
            else:
                for each_bm in self.bm_list:
                    print "Index :"+ str(each_bm[0])+" --"+ each_bm[1]+" "+each_bm[2]+" "+each_bm[3]
                choose_bm = raw_input('which bookmark?: \n')
                index=re.search(r"(\d*)", choose_bm).group(1)
                self.bm=self.bm_list[int(index)]
    
    
    
    
    
        def interface(self):
            while True:
                nb = raw_input('Give me your command: \n')
    
                if nb.startswith('v') == True:
                    os.system('cls')
                    if self.bm_file_exist ==True:
                        self.choose_bookmark(False)
                        self.Read_txt(True)
                    else:
                        print "no bookmark has been created yet"
    
                elif nb.startswith('n') == True:
                    os.system('cls')
    
                    files = [f for f in os.listdir('.') if os.path.isfile(f)]
                    print "text files in current folders---"
                    for f in files:
                        if f.endswith(".txt"):
                            print f
                    print "\n\n"
                    self.Read_txt(False)
                elif nb.startswith('c') == True:
                    os.system('cls')
                    self.choose_bookmark(True)
                    self.Read_txt(True)
    
                elif nb == "e":
                    os.system('cls')
                    print "bye bye"
                    break
                else:
                    
                    print """
    
                    Commands :
    
                    v - view bookmark
    
                    c - continue to read from last time
    
                    n - open a new txt file
    
                    e - exit 
    
                    """
    
    
    app=Reader()
    
    app.interface()
    
    

    相关文章

      网友评论

        本文标题:用python写一个文本阅读器

        本文链接:https://www.haomeiwen.com/subject/ehdqlxtx.html