Python - 如何查看不适合屏幕的输出?

时间:2010-07-22 02:07:56

标签: python

我应该说我正在寻找解决查看不适合屏幕的输出问题的方法。例如,范围(100)将显示终端中的最后30行30高度。

我只是想朝着正确的方向前进,我很好奇你们是如何解决这个问题的。

当您遇到希望可以方便地滚动某些大输出的情况时,您做了什么?

最佳答案

使用终端上的回滚缓冲区。

如果您使用的是GNU Screen,可以使用defscrollback 1000HOME/.screenrc中的任何其他号码进行设置。

使用Ctrl-a, [进入复印模式

j -    Move the cursor down by one line
k -    Move the cursor up by one line
C-u -  Scrolls a half page up.
C-b -  Scrolls a full page up.
C-d -  Scrolls a half page down.
C-f -  Scrolls the full page down.
G -    Moves to the specified line 

最佳部分是?用于反向搜索,/用于在复制模式下进行正向搜索。

超级方便。

谢谢!


原始问题:

什么是bash less命令的python等价物?

LongString | less 

python有类似的东西吗?我发现自己认为我可以经常使用它,但继续前进并找到其他解决方案。

“长事”是指产生比我的屏幕更多输出线的任何东西。 1000条打印消息,一本字典,一个大字符串,范围(1000)等。

我的googlefu失败了。

9 个答案:

答案 0 :(得分:8)

只是为了好玩:o)

Python2的原始版本:

class Less(object):
    def __init__(self, num_lines):
        self.num_lines = num_lines
    def __ror__(self, other):
        s = str(other).split("\n")
        for i in range(0, len(s), self.num_lines):
            print "\n".join(s[i: i + self.num_lines])
            raw_input("Press <Enter> for more")

less = Less(num_lines=30)  
"\n".join(map(str, range(100))) | less

Python3版本:

class Less(object):
    def __init__(self, num_lines):
        self.num_lines = num_lines
    def __ror__(self, other):
        s = str(other).split("\n")
        for i in range(0, len(s), self.num_lines):
            print(*s[i: i + self.num_lines], sep="\n")
            input("Press <Enter> for more")

less = Less(num_lines=30)  
"\n".join(map(str, range(100))) | less

答案 1 :(得分:4)

如果要为交互式python会话执行此操作,则应使用允许您向上滚动的终端仿真。我相信他们中的大多数人都这样做。

如果您使用的是实际终端,或者您没有选择终端模拟器,也许您可​​以使用GNU screen

(如果您使用的是Windows,则可以更改屏幕缓冲区大小以允许向上滚动至9999行。)

如果你需要这个用于程序的输出,你可以尝试使用curses模块自己实现滚动。

答案 2 :(得分:2)

是的,有一种方法,这是非常微不足道的,这就是为什么没有具体描述。假设你有很长的名单,并且只想看到开头:

>>> lst = range(1000)   # let's make list of thousand elements
>>> lst[:100]           # i want to see just the first 100
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>> lst[100:201]        # ok, now the 2nd hundred 
[100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200]
>>> lst[-100:]          # and now just the last 100, pretty please?
[900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999]

相同的[]切片对字符串的作用相同。对于字典,您可以以某种方式作弊,例如使用str()将其转换为字符串,然后使用相同的切片显示: - )

答案 3 :(得分:1)

假设您正在使用Python编写程序,它所做的一切都是打印一些东西。输出位于prettiest_print_ever。你已经做了奇怪的技巧导入fcntltermiosstruct和朋友来获取终端大小,以便你可以使用终端的全宽(如果有的话);这也给你屏幕高度,所以使用它是有道理的。 (这也意味着你很久就放弃了任何跨平台兼容性的借口。)

当然,你可以重新发明轮子,或者你可以像其他程序一样依赖(例如git diff)。这应该是解决方案的大纲:

def smart_print(prettiest_print_ever, terminal_height = 80):
  if len(prettiest_print_ever.splitlines()) <= terminal_height:
    #Python 3: make sure you write bytes!
    sys.stdout.buffer.write(prettiest_print_ever.encode("utf-8"))
  else
    less = subprocess.Popen("less", stdin=subprocess.PIPE)
    less.stdin.write(prettiest_print_ever.encode("utf-8"))
    less.stdin.close()
    less.wait()

答案 4 :(得分:0)

如果您在ipython工作,则可以在交互式python会话中发出shell命令。这意味着你只需要

In [1]: less myfile.txt

我也非常希望能够上下箭头来获取以前的命令并通过执行类似

之类的操作获取先前命令的输出
In [33]: print cos(Out[7]*pi/180)

答案 5 :(得分:0)

在shell中运行较少与Python之间存在一个根本区别:Python是一种编程语言,而不是程序。

Bash知道控制台中的linecount是什么,并且可以查询(以及其他许多东西),Python本身不能,它是一种语言,它与其环境无关(左边)到图书馆)。

最重要的是,少遵守一些自己的标准。关注行被移到顶部,它提供给termcap,它在概念上是OS工具的一部分,即使它还没有读完文件也意味着发送到输出。

如果需要,可以在Python中编写更少的内容,或者在python脚本中运行它,但它的功能比单个文件应该包含的内容更多(而且更具体)。

答案 6 :(得分:0)

如果您的数据是json serilizable,那么您可以尝试

import simplejson
print simplejson.dumps({'shipping-line': {'price': '0.00', 'code': 'Local Pickup (Portland, OR)', 'title': 'Local Pickup (Portland, OR)'}}, indent=4)

输出看起来像

{
    "shipping-line": {
        "price": "0.00", 
        "code": "Local Pickup (Portland, OR)", 
        "title": "Local Pickup (Portland, OR)"
    }
}

这是专门用于调试和查看实际内容......以良好的可读格式..

修改

如果您的屏幕限制为25行..........

import simplejson
data = simplejson.dumps({'shipping-line': {'price': '0.00', 'code': 'Local Pickup (Portland, OR)', 'title': 'Local Pickup (Portland, OR)'}}, indent=4)

cnt = 0

for line in data.split('\n'):
    cnt+=1
    print line
    raw_input() if cnt%25==0 else None

答案 7 :(得分:-1)

自己编写很容易:

def less(s, line_count = 5):
    lines = []
    for i, line in enumerate(s.split('\n'), 1):
        lines.append(line)
        if (i % line_count) == 0:
            yield '\n'.join(lines)
            lines = []

    if lines:
        yield '\n'.join(lines)

答案 8 :(得分:-1)

  

当你遇到希望方便的情况时,你做了什么?滚动浏览一些大输出?

  1. 不要创建大输出。使用功能汇总或显示所选的详细信息。

  2. 简化应用程序以避免首先创建大量输出。

  3. 关注我正在考虑的内容以避免大量输出。

  4. 一般避免大输出。

  5. 避免大输出似乎比试图显示我从未关心过的东西更为简单。