如何在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
相关产品推荐
相关产品推荐

