如何用Python实现类似Linux Nano的实时文本文件编辑功能?
需求说明
我想用Python实现类似Linux里Nano编辑器的实时文本编辑功能,就像当前文本框这样,能实时写内容、编辑,最后保存到文件。现在完全没思路,还没开始尝试,想要个简单的实现方案,不用追求高效率。
当前脚本的读写文件代码
f = open('./PYOS/startMessage.txt', 'r') start_message = f.read() print(start_message) f.close() while True: user_input = str(input('P:\> ')) command = user_input.lower() if command == 'read': filename = input('Filename: ') try: file = open(filename, 'r') cont = file.read(filename) print('File contents: ', cont) except FileNotFoundError: print('File not found please try again') elif command == 'write': filename = input('Filename: ') try: file = open(filename, 'w') write = input('Write in file: ') cont = file.read(filename) print('You wrote: ', cont) except FileNotFoundError: print('File not found please try again')
简单实现方案
要做实时终端编辑,不能用普通的input(),得用终端交互的库。Python自带的curses库刚好能满足需求,不用额外装依赖,适合做这种简单编辑器。
极简版编辑器实现
下面是个基础版代码,支持光标移动、输入文本、删除、换行、保存退出:
import curses def nano_like_editor(filename): # 初始化终端环境 stdscr = curses.initscr() curses.curs_set(1) # 显示光标 stdscr.clear() # 读取目标文件内容,不存在就新建 try: with open(filename, 'r') as f: lines = [line.rstrip('\n') for line in f.readlines()] except FileNotFoundError: lines = [] current_line = 0 current_col = 0 while True: # 刷新屏幕内容 stdscr.clear() # 底部显示操作提示 stdscr.addstr(curses.LINES - 1, 0, "Ctrl+S 保存 | Ctrl+Q 退出") # 逐行显示文件内容 for idx, line in enumerate(lines): if idx < curses.LINES - 2: # 留一行放提示 stdscr.addstr(idx, 0, line) # 确保光标位置合法 if current_line < len(lines): current_col = min(current_col, len(lines[current_line])) stdscr.move(current_line, current_col) # 获取按键输入 key = stdscr.getch() # 处理各种按键操作 if key == curses.KEY_UP and current_line > 0: current_line -= 1 current_col = min(current_col, len(lines[current_line])) elif key == curses.KEY_DOWN and current_line < len(lines) - 1: current_line += 1 current_col = min(current_col, len(lines[current_line])) elif key == curses.KEY_LEFT and current_col > 0: current_col -= 1 elif key == curses.KEY_RIGHT: if current_line < len(lines) and current_col < len(lines[current_line]): current_col += 1 elif key in (curses.KEY_BACKSPACE, 127): # 退格键 if current_col > 0: # 删除光标前的字符 lines[current_line] = lines[current_line][:current_col-1] + lines[current_line][current_col:] current_col -= 1 elif current_line > 0: # 行首退格,合并到上一行 current_col = len(lines[current_line-1]) lines[current_line-1] += lines[current_line] del lines[current_line] current_line -= 1 elif key in (curses.KEY_ENTER, 10): # 回车键 if current_line < len(lines): # 拆分当前行 line_content = lines[current_line] lines[current_line] = line_content[:current_col] lines.insert(current_line + 1, line_content[current_col:]) else: # 新增空行 lines.append("") current_line += 1 current_col = 0 elif key == 19: # Ctrl+S 保存 with open(filename, 'w') as f: f.write('\n'.join(lines) + '\n') # 显示保存成功提示 stdscr.addstr(curses.LINES - 1, 30, "已保存") stdscr.refresh() curses.napms(500) # 提示显示0.5秒 elif key == 17: # Ctrl+Q 退出 break elif 32 <= key <= 126: # 可打印字符 if current_line < len(lines): lines[current_line] = lines[current_line][:current_col] + chr(key) + lines[current_line][current_col:] else: lines.append(chr(key)) current_col += 1 # 恢复终端原有设置 curses.endwin() # 集成到你的现有脚本 if __name__ == "__main__": f = open('./PYOS/startMessage.txt', 'r') start_message = f.read() print(start_message) f.close() while True: user_input = str(input('P:\> ')) command = user_input.lower() if command == 'read': filename = input('Filename: ') try: with open(filename, 'r') as file: cont = file.read() print('文件内容: ', cont) except FileNotFoundError: print('未找到文件,请重试') elif command == 'write': filename = input('Filename: ') nano_like_editor(filename) elif command == 'exit': print('退出程序') break
集成说明
- 把上面的
nano_like_editor函数复制到你的脚本里 - 修改原有
write命令的逻辑,替换成调用这个编辑器函数就行 - 新增
exit命令方便退出脚本(你也可以自己调整)
这个版本只实现了最核心的编辑功能,足够日常使用,符合你要的简单方案,不用额外装任何依赖,直接就能运行。
内容的提问来源于stack exchange,提问作者Myyraman
相关产品推荐
相关产品推荐

