You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

集成说明

  1. 把上面的nano_like_editor函数复制到你的脚本里
  2. 修改原有write命令的逻辑,替换成调用这个编辑器函数就行
  3. 新增exit命令方便退出脚本(你也可以自己调整)

这个版本只实现了最核心的编辑功能,足够日常使用,符合你要的简单方案,不用额外装任何依赖,直接就能运行。

内容的提问来源于stack exchange,提问作者Myyraman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:55:22