当我当前从数据库中读取数据时,我有一个程序,可以在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,但它们处理的数据很少,因此更容易设置宽度。该数据包含巨大的字符串。
非常感谢!
答案 0 :(得分:0)
评论:
_
在#2 中是什么意思?
阅读What is the purpose of the single underscore “_” variable in Python?
在这里,“ 3。作为通用的“丢弃”变量名” ,我们不需要range(...
值。
问题:将数据库记录显示为具有相等列的表
获取列名并将其添加到results
之前。
header = tuple(i[0] for i in cur.description)
data = [header] + results
使用config
将list
初始化为{'width':0}
。
创建与数据库表中的列一样多的dict
项。
config = [{'width':0} for _ in range(len(data[0]))]
环绕整个数据,该数据是list
中的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)))
使用format list
中的width
准备config
format_ = []
for f in config:
format_.append('{:<' + str(f['width']) + '}')
使用list format_
作为分隔符将str
转换为'|'
。
format_ = ' | '.join(format_)
环绕data
的{{1}},list
,使用tuple
字符串打印。
format_
使用Python测试:3.5