动态多行刷新Python中的打印

时间:2014-03-17 20:22:14

标签: python json dynamic printing

我对Python完全不熟悉,而且我无法弄明白该怎么做。

我想做的事情:

我希望能够在控制台中的多行上动态重写输出。我已经看到了许多针对单线输出的解决方案,但对于多线路没有那么多解决方案。 Stack Overflow上的以下线程类似,但并没有完全解决我的问题(我稍后会解释原因):

Python - Rewrite multiple lines in the Console

Dynamic refresh printing of multiprocessing or multithreading in Python

另外,我希望能够将输出重定向到文件或管道(假设在上面提供的解决方案中,我会运行./script.py> out.txt,如果我打断它,我希望中间进度条在输出文件中。)

为什么我要这样做?

我正在尝试解析一个看起来像这样的连续Json流:

{
...valid Json data block...
},{
...Another valid Json data block...
}, etc...

我最终想要的是(我需要帮助的过程是对唯一一个Json块的过滤器):

./generate-stream | ./filter-single-view | ./json-processing

注意:我使用Json的事实对我的问题并不重要,我主要是说它给你一个上下文。这个想法只是让一个脚本管道生成多个数据,过滤它一次只有一个数据,然后处理这些数据。

我已经解析了流以将我的Json块放在我想要打印的字符串中(然后打印下一个将重写它的字符串)。 动态刷新示例:

{
"i": 0
}

控制台输出步骤1(我已将所有信息存储在字符串中)

{
"i": 1
}

控制台输出步骤2

{
"i": 2
}

控制台输出步骤3等......

因此,第一个线程的答案不能解决我的问题,因为我无法输出结果,而第二个线程的答案因同样的原因不起作用+这种清除屏幕的方法会混淆数据,在下一个过程中无法正常使用。另一件可以解决我问题的方法是找到一种方法来连续忽略清晰的屏幕角色(我试过忽略第一个字符,它适用于第一个输入,然后全部搞砸了)

如果不清楚,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:0)

我设法解决了我的问题!

我告诉你上面的流格式,不用担心解析细节。此代码解析流并单独显示Json数据

    import sys
    import json
    import os

    def main(): 
        json_string=""
        try:
            while True:
                line=sys.stdin.readline()
                if line!="},{\n":
                    json_string=json_string+line
                    continue
                else:
                    #Output singular Json data
                    json_string=json_string+"}\n"
                    json_data=json.loads(json_string)
                    json.dump(json_data, sys.stdout) 
                    os.system('cls' if os.name == 'nt' else 'clear')
                    sys.stdout.flush() 
                    json_string="{\n" 
        except KeyboardInterrupt:
            sys.stdin.close()
            print "Interrupted by user. Bye!"  

    if __name__ == "__main__":
        main()

现在,我希望在另一个用管道传输的脚本(stdin)中读取这些奇异数据。我并不真正理解为什么,但任何readline都会阻塞。因此,我实现了以下

    import sys
    import json
    import os

    k = 0
    parsing=False
    try:
        buff = ''
        while True:
            #The 2 following functions are blocking
            #buff= sys.stdin.readline()
            #buff = json.load(sys.stdin)
            buff += sys.stdin.read(1)
            if buff.endswith('{'):
                parsing=True;
                k+=1
            if buff.endswith('}'):
                k-=1
            if k==0 and parsing:
                print buff
                #The first 7 characters clear the screen
                data=json.loads(buff[7:])
                buff = ''
                parsing=False

    except KeyboardInterrupt:
       sys.stdout.flush()
       pass

如果您对此有任何意见,请与我们联系。