apt 像列输出 - python 库 [英] apt like column output - python library

查看:23
本文介绍了apt 像列输出 - python 库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Debian 的 apt 工具输出结果为统一宽度的列.例如,尝试运行aptitude search svn" .. 并且所有名称都出现在相同宽度的第一列中.

Debian's apt tool outputs results in uniform width columns. For instance, try running "aptitude search svn" .. and all names appear in the first column of the same width.

现在,如果您调整终端的大小,列宽也会相应调整.

Now if you resize the terminal, the column width is adjusted accordingly.

是否有一个 Python 库可以让人们做到这一点?请注意,库必须知道终端宽度并将表格作为输入 - 例如,可以是 [('rapidsvn', 'A GUI client for subversion'), ...] .. 并且您还可以为第一列(或任何列)指定最大宽度.还要注意下面第二列中的字符串如何在超过终端宽度时被修剪.. 从而不会引入不需要的第二行.

Is there a Python library that enables one to do this? Note that the library has to be aware of the terminal width and take a table as input - which could be, for instance, [('rapidsvn', 'A GUI client for subversion'), ...] .. and you may also specify a max-width for the first column (or any column). Also note how the string in the second column below is trimmed if exceeds the terminal width .. thus not introducing the undesired second line.

$ aptitude search svn
[...]
p   python-svn-dbg                    - A(nother) Python interface to Subversion (d
v   python2.5-svn                     -                                            
v   python2.6-svn                     -                                            
p   rapidsvn                          - A GUI client for subversion                
p   statsvn                           - SVN repository statistics                  
p   svn-arch-mirror                   - one-way mirroring from Subversion to Arch r
p   svn-autoreleasedeb                - Automatically release/upload debian package
p   svn-buildpackage                  - helper programs to maintain Debian packages
p   svn-load                          - An enhanced import facility for Subversion 
p   svn-workbench                     - A Workbench for Subversion                 
p   svnmailer                         - extensible Subversion commit notification t
p   websvn                            - interface for subversion repositories writt
$

编辑:(回应下面亚历克斯的回答)......输出将类似于 'aptitude search' 1)只有最后一列(这是唯一最长的列一行中的字符串)将被修剪,2)通常只有 2-4 列,但最后一列(描述")预计至少占终端宽度的一半.3)所有行包含相同数量的列,4)所有条目都只是字符串

EDIT: (in response to Alex's answer below) ... the output will be similar to 'aptitude search' in that 1) only the last column (which is the only column with the longest string in a row) is to be trimmed, 2) there are typically 2-4 columns only, but the last column ("description") is expected to take at least half the terminal width. 3) all rows contain equal number of columns, 4) all entries are strings only

推荐答案

我不认为有一种通用的、跨平台的方式来获取终端的宽度"——绝对不是查看 COLUMNS 环境变量"(请参阅​​我对问题的评论).在 Linux 和 Mac OS X(我希望所有现代 Unix 版本)上,

I don't think there's a general, cross-platform way to "get the width of the terminal" -- most definitely NOT "look at the COLUMNS environment variable" (see my comment on the question). On Linux and Mac OS X (and I expect all modern Unix versions),

curses.wrapper(lambda _: curses.tigetnum('cols'))

返回列数;但我不知道 wcurses 在 Windows 中是否支持此功能.

returns the number of columns; but I don't know if wcurses supports this in Windows.

一旦你有了(来自 os.environ['COLUMNS'] 如果你坚持,或者通过curses,或者来自oracle,或者默认为80,或者你喜欢的任何其他方式)所需的输出宽度,剩下的就是相当可行.这是一项繁琐的工作,有很多机会出现一种类型的错误,并且很容易受到许多您没有完全弄清楚的详细规范的影响,例如:哪一列被剪切以避免换行——它总是最后一个,还是……?当根据您的问题只传入两列时,您怎么会在示例输出中显示 3 列......?如果不是所有行都具有相同的列数,会发生什么?表中的所有条目都必须是字符串吗?以及许多其他类似的谜团.

Once you do have (from os.environ['COLUMNS'] if you insist, or via curses, or from an oracle, or defaulted to 80, or any other way you like) the desired output width, the rest is quite feasible. It's finnicky work, with many chances for off-by-one kinds of errors, and very vulnerable to a lot of detailed specs that you don't make entirely clear, such as: which column gets cut to avoid wrapping -- it it always the last one, or...? How come you're showing 3 columns in the sample output when according to your question only two are passed in...? what is supposed to happen if not all rows have the same number of columns? must all entries in table be strings? and many, many other mysteries of this ilk.

因此,对您没有表达的所有规范进行一些武断的猜测,一种方法可能类似于...:

So, taking somewhat-arbitrary guesses for all the specs that you don't express, one approach might be something like...:

import sys

def colprint(totwidth, table):
  numcols = max(len(row) for row in table)
  # ensure all rows have >= numcols columns, maybe empty
  padded = [row+numcols*('',) for row in table]
  # compute col widths, including separating space (except for last one)
  widths = [ 1 + max(len(x) for x in column) for column in zip(*padded)]
  widths[-1] -= 1
  # drop or truncate columns from the right in order to fit
  while sum(widths) > totwidth:
    mustlose = sum(widths) - totwidth
    if widths[-1] <= mustlose:
      del widths[-1]
    else:
      widths[-1] -= mustlose
      break
  # and finally, the output phase!
  for row in padded:
    for w, i in zip(widths, row):
      sys.stdout.write('%*s' % (-w, i[:w]))
    sys.stdout.write('\n')

这篇关于apt 像列输出 - python 库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆