import re, sys from cppy.cp_util import * stops = get_stopwords() data = {} # 路径问题,测试输入 test.txt ,演示当前目录下这个文件的处理 ################################################################################# # 服务端 def error_state(): return "Something wrong", ["get", "default", None] def quit_handler(args): sys.exit(" ... ") def upload_get_handler(args): return "Name of file to upload?", ["post", "file"] def default_get_handler(args): rep = "What would you like to do?" rep += "\n1 - Quit" + "\n2 - Upload file" links = {"1" : ["post", "execution", None], "2" : ["get", "file_form", None]} return rep, links def upload_post_handler(args): def create_data(fn): if fn in data: return word_freqs = {} with open(fn) as f: for w in [x.lower() for x in re.split("[^a-zA-Z]+", f.read()) if len(x) > 0 and x.lower() not in stops]: word_freqs[w] = word_freqs.get(w, 0) + 1 wf = list(word_freqs.items()) data[fn] = sorted(wf,key=lambda x: x[1],reverse=True) if args == None: return error_state() filename = args[0] try: script_dir = os.path.dirname(os.path.abspath(__file__)) filename = os.path.join(script_dir, filename) create_data(filename) except: print("Unexpected error: %s" % sys.exc_info()[0]) return error_state() return word_get_handler([filename, 0]) def word_get_handler(args): def get_word(filename, word_index): if word_index < len(data[filename]): return data[filename][word_index] else: return ("no more words", 0) filename = args[0]; word_index = args[1] word_info = get_word(filename, word_index) rep = '\n#{0}: {1} - {2}'.format(word_index+1, word_info[0], word_info[1]) rep += "\n\nWhat would you like to do next?" rep += "\n1 - Quit" + "\n2 - Upload file" rep += "\n3 - See next most-frequently occurring word" links = {"1" : ["post", "execution", None], "2" : ["get", "file_form", None], "3" : ["get", "word", [filename, word_index+1]]} return rep, links # Handler registration handlers = {"post_execution" : quit_handler, "get_default" : default_get_handler, "get_file_form" : upload_get_handler, "post_file" : upload_post_handler, "get_word" : word_get_handler } # The "server" core def handle_request(verb, uri, args): def handler_key(verb, uri): return verb + "_" + uri if handler_key(verb, uri) in handlers: return handlers[handler_key(verb, uri)](args) else: return handlers[handler_key("get", "default")](args) ################################################################################# # 仿真简单的浏览器客户端动作 def render_and_get_input(state_representation, links): print(state_representation) sys.stdout.flush() if type(links) is dict: input = sys.stdin.readline().strip() if input in links: return links[input] else: return ["get", "default", None] elif type(links) is list: if links[0] == "post": # get "form" data input = sys.stdin.readline().strip() links.append([input]) # add the data at the end return links else: # get action, don't get user input return links else: return ["get", "default", None] if __name__ == "__main__": request = ["get", "default", None] while True: state_representation, links = handle_request(*request) # "server" request = render_and_get_input(state_representation, links) # "client"