【问题标题】:Python: Read database to display table with equal columnsPython:读取数据库以显示具有相等列的表
【发布时间】:2019-05-02 19:53:55
【问题描述】:

我有一个程序当前从数据库中读取,可以在here 找到。我让用户选择他们想要显示的特定记录,以便 SQL 命令执行该记录。现在我有一个当前显示这些记录的表,但是,这些列不是我想要的样子,因为我正在处理长字符串数据。

我没有使用任何扩展库。除了供应商、订单、类别等表格外,我的表格显示对于某些表格来说是相同的。每列的宽度太长了。它占用太多空间。

我认为我的代码目前从整个表格中获取最长的字符串,并为每列设置该字符串的宽度。我想要它做的是为每列而不是整个表获取最长的字符串,因此每列的宽度由该列的字符串长度(当然还有一点额外的空间)设置。

到目前为止,这是我的代码:

import sqlite3

def read_display(record):
  database = 'data.db'
  connection = sqlite3.connect(database)
  c = connection.cursor()
  # selects a table to display
  sql = "SELECT * FROM {0}".format(record)
  cursor.execute(sql)
  conn.commit()
  results = cursor.fetchall()

  header = [i[0] for i in c.description]
  data = [header] + list(tuple(results))
  width = max((len(str(x)) for d in data for x in d))

  for i, d in enumerate(data):
      line = ' | '.join(str(x).ljust(width) for x in d)
      print(line)
      if i == 0:
         print('-' * len(line))

我试图弄乱width 变量,但我似乎无法弄清楚。我尝试查看其他 StackOverflow q,但它们处理的数据很少,因此设置宽度更容易。该数据包含巨大的字符串。

非常感谢!

【问题讨论】:

    标签: python sql database sqlite


    【解决方案1】:

    评论#2中的_是什么意思?

    阅读What is the purpose of the single underscore “_” variable in Python?
    这里,“3. 作为一个通用的“一次性”变量名”,我们不需要range(... 值。


    问题:将数据库记录显示为具有相等列的表

    1. 获取列名并将其添加到results

          header = tuple(i[0] for i in cur.description)
          data = [header] + results
      
    2. config 初始化为list{'width':0}
      在数据库表中创建与列一样多的 dict 项。

          config = [{'width':0} for _ in range(len(data[0]))]
      
    3. 循环整个数据,即list of tuple
      找到max len 并将其存储在config dict 列中

          for rec in data:
              for c, value in enumerate(rec):
                  config[c]['width'] = max(config[c]['width'], len(str(value)))
      
    4. 准备format list,使用config中的width

          format_ = []
          for f in config:
              format_.append('{:<' + str(f['width']) + '}')
      
    5. 使用'|' 作为分隔符将list format_ 转换为str

          format_ = ' | '.join(format_)
      
    6. 循环tupledatalist,使用format_字符串打印。

          for rec in data:
              print(format_.format(*rec))
      

    用 Python 测试:3.5

    【讨论】:

    • 我正在尝试关注,您是否碰巧有完整代码的 repl 示例?
    • 这是一个完整的工作示例,将您的问题代码替换为以 header = 开头的行
    • #2 中的 _ 是什么意思?可以是任何名称/变量吗?
    • @Smokingpenguin:更新了我的答案。阅读What should I do when someone answers my question?
    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 2012-11-17
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2013-03-04
    相关资源
    最近更新 更多