4

我想为我的小孩写一个包含一些算术问题的文件。我想有一些着色,这样他就可以轻松区分正负。这对我很有用。不幸的是,只在一个终端。

import random as rd
from termcolor import colored

N = 10
MAX = 100
f = open("math.txt", "w")


def get_random_str():

    a = rd.randint(1, MAX)
    b = rd.randint(1, MAX)

    if a < MAX*0.4:
        string = "%3d "%a + str(colored('+', 'blue')) + " %d = \n"%(b)

    else:
        if a>b:
            string = "%3d "%a + str(colored('-', 'red')) + " %d = \n"%(b)

        else:
            string = "%3d "%a + str(colored('-', 'red')) + " %d = \n"%(b)

    return string
#-------------------------------------------------------------------------

for i in range(1,N):
    print i, get_random_str()

当我尝试将输出写入文件时,当然我只是得到颜色代码,例如“[34m+[0m”而不是红色“-”和蓝色“+”。

知道如何解决这个任务吗?

4

4 回答 4

6

您可以使用任何合适的词法分析器TerminalFormatter查看Pygments

例如以下代码:

import sys
from pygments import highlight
from pygments.formatters.terminal import TerminalFormatter
from pygments.lexer import RegexLexer
from pygments.token import Token


class ArithmeticLexer(RegexLexer):
    tokens = {
        'root': [
            (r'[ \n]', Token.Whitespace),
            (r'\d+', Token.Number),
            (r'\+', Token.Plus),
            (r'-', Token.Minus),
            (r'\*', Token.Multiply),
            (r'/', Token.Division),
        ]
    }

COLOR_SCHEME = {
    Token.Whitespace: ('', ''),
    Token.Number: ('darkgreen', 'green'),
    Token.Plus: ('darkred', 'red'),
    Token.Minus: ('darkblue', 'blue'),
    Token.Multiply: ('darkyellow', 'yellow'),
    Token.Division: ('brown', 'fushia'),
}

if __name__ == '__main__':
    with open(sys.argv[1], 'rb') as f:
        for line in f:
            line = highlight(line, ArithmeticLexer(), TerminalFormatter(colorscheme=COLOR_SCHEME))
            print line.strip()

给出:

在此处输入图像描述

使用具有给定内容的文件运行时。用法是<script_name> <input_file_name>

颜色的参考。中的颜色COLOR_SCHEME是 的元组(lightscheme, darkscheme)。默认情况下TerminalFormatter使用lightscheme.

于 2013-07-21T12:23:35.760 回答
3

这需要您用于查看文件的程序支持 ANSI 转义序列。例如,在带有less -R.

于 2013-07-21T12:24:48.063 回答
1

使用 CSI 颜色转义序列

CSI 代表控制序列引入器。这是一个包含更多 CSI 颜色的列表。

csi = '\x1B['
red = csi + '31;1m'
yellow = csi + '33;1m'
end = csi + '0m'

print('Here is a %sred%s word and one in %syellow!%s' % (red, end, yellow, end))
于 2016-11-30T16:08:37.057 回答
0

您可能想要写入 RTF 文件而不是纯文本文件。通过这种方式,您可以编写文本并在具有全彩色和高亮显示的文字处理器中打开

或者只是写入一个 HTML 文件。

于 2013-07-21T18:26:09.077 回答