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

如何在Python中实现屏幕右侧打印文本分析的另一部分内容

Python文本分析工具左右分栏输出解决方案

常见分栏实现方案

方案1:手动字符串拼接(轻量场景)

核心思路是分别生成左右两部分的每行内容列表,补全行数后逐行拼接输出,适合简单文本布局:

# 假设已生成左侧内容行列表left_lines、右侧内容行列表right_lines
import os
from wcwidth import wcswidth  # 处理中英文混合宽度问题,需先安装:pip install wcwidth

# 获取终端宽度,计算左右分栏的分隔位置
terminal_width = os.get_terminal_size().columns
left_max_width = max(wcswidth(line) for line in left_lines)
right_start = left_max_width + 2  # 左右留2个空格间距

# 补全行数,确保左右行数一致
max_lines = max(len(left_lines), len(right_lines))
left_lines += [' ' * left_max_width] * (max_lines - len(left_lines))
right_lines += [' ' * (terminal_width - right_start)] * (max_lines - len(right_lines))

# 逐行拼接输出
for l, r in zip(left_lines, right_lines):
    # 计算左侧实际宽度,补全空格保证右侧对齐
    l_padded = l + ' ' * (left_max_width - wcswidth(l))
    print(f"{l_padded}{r}")

方案2:用rich库实现终端布局(推荐)

rich是成熟的终端格式化库,自带分栏组件,无需手动计算宽度,支持复杂内容渲染:

# 先安装:pip install rich
from rich.console import Console
from rich.columns import Columns
from collections import Counter

def get_analysis_content(text):
    # 生成左侧字母频率+Top5内容
    letters = [c.lower() for c in text if c.isalpha()]
    freq = Counter(letters)
    max_freq = max(freq.values()) if freq else 1
    bar_lines = [f"{char.upper()}: {'█'*int((count/max_freq)*20)} {count}" for char, count in sorted(freq.items())]
    top5_lines = ["\nTop5频率:"] + [f"{char.upper()}: {count}" for char, count in freq.most_common(5)]
    left_content = ["字母频率柱状图:"] + bar_lines + top5_lines

    # 生成右侧统计内容
    total_chars = len(text)
    letter_count = len(letters)
    vowel_count = sum(1 for c in letters if c in 'aeiou')
    right_content = [
        "文本统计信息:",
        f"总字符数: {total_chars}",
        f"字母总数: {letter_count}",
        f"元音数量: {vowel_count}",
        f"元音占比: {vowel_count/letter_count:.1%}" if letter_count else "元音占比: 0%"
    ]
    return left_content, right_content

if __name__ == "__main__":
    with open("test.txt", "r", encoding="utf-8") as f:
        text = f.read()
    left, right = get_analysis_content(text)
    console = Console()
    console.print(Columns([left, right], width=45))  # width参数控制单栏宽度

方案3:用curses库精确控制光标(复杂界面)

适合需要完全自定义终端界面的场景,直接定位光标到右侧区域输出:

import curses

def main(stdscr):
    stdscr.clear()
    height, width = stdscr.getmaxyx()
    mid_width = width // 2  # 分栏中线位置

    # 输出左侧内容
    left_text = """字母频率柱状图:
A: ████████████ 12
B: ██████ 6
...
Top5频率:
A:12
B:6"""
    for i, line in enumerate(left_text.split('\n')):
        stdscr.addstr(i, 0, line)

    # 输出右侧内容
    right_text = """其他分析内容:
总字符数:100
元音占比:35%"""
    for i, line in enumerate(right_text.split('\n')):
        stdscr.addstr(i, mid_width, line)

    stdscr.getch()  # 等待输入后退出

curses.wrapper(main)

报错排查要点

如果之前尝试时报错,大概率是以下原因:

  • 光标越界:直接定位光标时未获取终端宽度,右侧起始位置超过终端边界,需用os.get_terminal_size().columns获取宽度后计算
  • 宽度计算错误:中英文混合时用len()计算长度会导致对齐偏差,必须用wcwidth库计算实际显示宽度
  • 换行干扰:左侧内容输出时未控制换行逻辑,导致右侧内容被挤到下方,需先收集所有行内容再统一拼接输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:35:00