当前位置: 首页 > 面试题库 >

像列输出一样易于使用-python库

夏侯弘量
2023-03-14
问题内容

Debian的apt工具输出会导致宽度一致的列。例如,尝试运行“ aptitude search svn” ..,所有名称都显示在相同宽度的第一列中。

现在,如果您调整终端的大小,则会相应地调整列宽。

是否有一个Python库可以使您做到这一点?请注意,库必须知道终端的宽度,并以表格作为输入-例如,可以为[('rapidsvn', 'A GUI client for subversion'), ...]..,也可以为第一列(或任何列)指定最大宽度。还要注意,如果超出终端宽度,则如何修剪下面第二栏中的字符串,因此不会引入不希望的第二行。

$ 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
$

编辑 :(作为对下面亚历克斯回答的回应)…输出将类似于“智能搜索”,即1)仅将最后一列(这是一行中最长的字符串)修剪掉,
2)通常只有2-4列,但最后一列(“说明”)应至少占据端子宽度的一半。3)所有行包含相等数量的列,4)所有条目仅是字符串


问题答案:

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

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

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

一旦确定了输出宽度(如果您坚持要使用os.environ
[‘COLUMNS’],或者通过curses,或者是从oracle,或者默认为80,或者您希望的其他方式),那么其余的就很可行了。这是一项艰巨的工作,很可能会出现一种错误,并且很容易受到许多您无法完全弄清楚的详细规格的影响,例如:哪一列被剪掉以避免换行-
它总是最后一个,还是…?当根据您的问题仅传入两列时,您如何在示例输出中显示3列?如果不是所有行都具有相同的列数,应该怎么办?表中的所有条目都必须是字符串吗?以及许多其他类似的谜团。

因此,对您不表达的所有规格进行一些随意的猜测,一种方法可能类似于…:

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')


 类似资料:
  • 我是Python的新手,但来自JavaScript,我试图使用将对象/字典打印到终端,但结果是这样的。 我习惯于节点JS终端输出,并且想知道如何像在JS中那样格式化Python输出。 我用JavaScript中的一个类似的Node模块打印出来(我使用的是vscode终端)

  • 可以配置Vim将其用作IDE。在本节中,将讨论以下主题内容: 语法突出显示 智能缩进 跳转 执行shell命令 配置ctags和csope 自动完成和自动建议 1. 语法突出显示 语法突出显示是IDE的重要功能之一。要启用语法突出显示,请使用 - 例如,下图显示C代码的语法高亮显示 - 要禁用语法突出显示,请使用 - 禁用语法突出显示时,它将显示以下输出 - 2. 智能缩进 要执行自动和智能缩进,

  • 我写了这个程序,它以n和k为输入,然后以数组A[n]为输入。程序必须以数组a中小于k且为奇数的不同整数的总数no给出输出。但是这个程序的每一个输入都产生0作为输出。

  • 我有以下问题。我(完全菜鸟)想在不使用日历库的情况下获得一年中的一天来完成我的大学任务。 所以我在这里写我的代码,就像我认为它应该是这样的,但不知怎么的,我的结果得到了不同的结果,就像他们应该做的那样,我真的不知道为什么。我的代码很简单,我想也许你们中的一个人可以看到我的问题。现在已经过去了1-2个小时,时间对我来说已经不多了。 在我的程序的主要方法中,你可以清楚地看到我记录的内容,我希望有人能看

  • 问题内容: 我想编写一个行为类似的自定义类-因此,我继承自。 不过,我的问题是:我需要在我的方法中创建一个私有成员吗?我不明白这一点,因为如果我仅继承自,我已经具有了行为。 谁能指出为什么大多数继承片段看起来像下面的片段? 而不是简单的… 实际上,我认为我怀疑问题的答案是,用户无法直接访问您的词典(即,他们必须使用您提供的访问方法)。 但是,数组访问运算符呢?一个人将如何实现呢?到目前为止,我还没

  • 我正在使用python与mysql交互,当我从mysql访问列时,我得到如下输出: [('some','t5vd._kz'),('something','anything')] 我希望它是: 一些,t5vd._kz 一些,任何东西 我的代码: