这是python程序员的一道题。 有人知道如何以人类可读的方式打印 MySQLdb 查询结果吗? 类似于 mysql shell 打印的表的东西会很棒。
类似于:
+-----+---------------------+-----------+
| id | now() | aaa |
+-----+---------------------+-----------+
| 28 | 2012-03-01 14:24:02 | some text |
| 77 | 2012-03-01 14:24:02 | some text |
| 89 | 2012-03-01 14:24:02 | some text |
| 114 | 2012-03-01 14:24:02 | some text |
| 116 | 2012-03-01 14:24:02 | some text |
| 252 | 2012-03-01 14:24:02 | some text |
+-----+---------------------+-----------+
重要说明:它必须是 unicode,因为语言不一定是英语。 提前致谢!
示例:
MySql部分:
create table test.tmp_ids(id integer);
insert into test.tmp_ids values (28),(77),(89),(114),(116),(252);
python 代码:
cursor = db.cursor()
cursor.execute("select id, now(), 'some text' as aaa from test.tmp_ids")
rows = cursor.fetchall()
print rows <<<<<<<<<<< here instead of just "print rows" I would like to print it as a human-readable table.
最佳答案
我不知道针对任意 unicode 的好的解决方案,因为一些 unicode 可以特别窄或特别宽,甚至等宽字体似乎也不会将所有 unicode 呈现为具有相同的宽度(请参见下面的示例)。
然而,George Sakkis's table indentation recipe 上的这个变体可能就足够了:
将其保存在文件 table.py 中:
import operator
import itertools
import re
import math
import functools
import logging
logger = logging.getLogger(__name__)
zip_longest = itertools.izip_longest
def tableinfo(rows,
sep = u'─',
corner = u'·',
delim = None,
corner_delim = None,
prefix = u'│ ',
postfix = u' │',
colsep = u' │ ',
has_header = False,
header = None,
separate_rows = False,
framed = (True, True),
separate_empty_lines = True,
justify = 'right',
wrapfunc = lambda x:x,
width = None,
phantom = None,
**kw):
# Based on: http://code.activestate.com/recipes/267662-table-indentation/
# Author: http://code.activestate.com/recipes/users/2591466/ (George Sakkis)
def row_wrapper(row):
try:
new_rows = [wrapper(item).split('\n') for (item, wrapper)
in zip(row, wrapfunc)]
except TypeError:
# This happens if wrapfunc is not an iterator
# TypeError: zip argument #2 must support iteration
new_rows = [wrapfunc(item).split('\n') for item in row]
return list(zip_longest(*new_rows, fillvalue = u''))
if header:
has_header = True
rows = itertools.chain(normalize([header]), rows)
logical_rows = [row_wrapper(row) for row in rows]
columns = zip(*functools.reduce(operator.add, logical_rows))
max_width = (
[max(len(item) for item in column) for column in columns]
if width is None else width )
if phantom is not None:
max_width = [max(x) for x in zip(phantom, max_width)]
lcorner = corner + sep*(len(prefix)-1) if len(prefix) >= 1 else u''
rcorner = sep*(len(postfix)-1) + corner if len(postfix) >= 1 else u''
delim = itertools.repeat(colsep) if delim is None else itertools.cycle(delim)
corner_delim = (delim_to_corner(delim, sep, corner)
if corner_delim is None else itertools.cycle(corner_delim))
row_separator = (sep*w for w in max_width)
row_separator = (lcorner
+''.join(list(iterjoin(corner_delim, row_separator)))
+rcorner)
dispatch = {'center':unicode.center, 'right':unicode.rjust, 'left':unicode.ljust}
try: justify = itertools.cycle([dispatch[item] for item in justify])
except KeyError: justify = itertools.repeat(dispatch[justify.lower()])
result = []
for physical_rows in logical_rows:
row_result = []
for row in physical_rows:
if separate_empty_lines and not ''.join(row).strip():
row_result.append(row_separator)
else:
pieces = [justifier(item, w) for (item, w, justifier)
in zip(row, max_width, justify)]
row_result.append(
prefix
+ u''.join(list(iterjoin(delim, pieces)))
+ postfix )
result.append(u'\n'.join(row_result))
if has_header and not separate_rows:
result.insert(1, row_separator)
has_header = False
joiner = u'\n'+row_separator+u'\n' if separate_rows else u'\n'
result = joiner.join(result)
top_framed, bottom_framed = framed
if top_framed: result = row_separator+u'\n'+result
if bottom_framed: result = result+u'\n'+row_separator
return result, max_width
def iterjoin(sep, it):
sep = itertools.cycle(sep)
it = iter(it)
yield next(it)
for a, b in zip(it, sep):
yield b
yield a
def normalize(rows):
new_rows = []
for row in rows:
new_rows.append([unicode(elt).expandtabs() for elt in row])
return new_rows
def delim_to_corner(delim, sep, corner):
for d in delim:
d = d.replace(u'│', corner).replace(u'|', corner)
for c in '< >': d = d.replace(c, sep)
yield d
def wrap_onspace(text, width):
# written by Mike Brown
# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/148061
'''
A word-wrap function that preserves existing line breaks
and most spaces in the text. Expects that existing line
breaks are posix newlines (\n).
'''
words = iter(text.split(' '))
line = next(words)
for word in words:
contemplated_width = (len(line[line.rfind('\n')+1:]) +
len(word.split('\n', 1)[0]))
if contemplated_width >= width:
line += '\n'+word
else:
line += ' '+word
return line
def wrap_onspace_strict(text, width):
'''Similar to wrap_onspace, but enforces the width constraint:
words longer than width are split.'''
word_pat = re.compile(r'\S{'+unicode(width)+r',}')
return wrap_onspace(word_pat.sub(lambda m: wrap_always(m.group(), width), text),
width)
def wrap_always(text, width):
'''A simple word-wrap function that wraps text on exactly width characters.
It doesn\'t split the text in words.'''
return '\n'.join( text[width*i:width*(i+1)]
for i in xrange(int(math.ceil(1.*len(text)/width))) )
def onspace(width):
return functools.partial(wrap_onspace, width = width)
def strict(width):
return functools.partial(wrap_onspace_strict, width = width)
def always(width):
return functools.partial(wrap_always, width = width)
def table(rows,
sep = u'─',
corner = u'·',
delim = None,
corner_delim = None,
prefix = u'│ ',
postfix = u' │',
has_header = False,
header = None,
separate_rows = False,
framed = (True, True),
separate_empty_lines = True,
justify = 'right',
wrapfunc = lambda x:x,
width = None,
**kw):
'''
·──────────────────────·─────────────────────────────────────────────────────────·
│ rows │ A sequence of sequences of items, one sequence per row. │
·──────────────────────·─────────────────────────────────────────────────────────·
│ framed │ row separator on top and bottom │
·──────────────────────·─────────────────────────────────────────────────────────·
│ sep │ Character to be used for the row separator line (if │
│ │ has_header==True or separate_rows==True). │
·──────────────────────·─────────────────────────────────────────────────────────·
│ delim │ A sequence of column delimiters. The delimiters are │
│ │ repeated in a cycle │
·──────────────────────·─────────────────────────────────────────────────────────·
│ corner_delim │ A sequence of column delimiters used in row separators, │
│ │ repeated in a cycle. │
·──────────────────────·─────────────────────────────────────────────────────────·
│ prefix │ A string prepended to each printed row. │
·──────────────────────·─────────────────────────────────────────────────────────·
│ postfix │ A string appended to each printed row. │
·──────────────────────·─────────────────────────────────────────────────────────·
│ has_header │ True if there is a row separator between the first and │
│ │ second row │
·──────────────────────·─────────────────────────────────────────────────────────·
│ separate_rows │ True if all rows are to be separated │
·──────────────────────·─────────────────────────────────────────────────────────·
│ framed │ True if top (and/or bottom) have a row separator │
·──────────────────────·─────────────────────────────────────────────────────────·
│ separate_empty_lines │ replace empty lines with a row separator │
·──────────────────────·─────────────────────────────────────────────────────────·
│ justify │ Determines how the data is justified in each column. │
│ │ Valid values are 'left','right' and 'center', or a list │
│ │ of such values (one element per column). │
·──────────────────────·─────────────────────────────────────────────────────────·
│ wrapfunc │ A function f(text), or list of functions, for wrapping │
│ │ text; each element in the table is first wrapped by │
│ │ this function. If wrapfunc is a list of functions, then │
│ │ table will apply one function per column. │
·──────────────────────·─────────────────────────────────────────────────────────·
│ width │ A list of column widths. If None, the widths will be │
│ │ calculated. │
·──────────────────────·─────────────────────────────────────────────────────────·
'''
result, max_width = tableinfo(
normalize(rows), sep = sep, corner = corner, delim = delim,
corner_delim = corner_delim,
prefix = prefix, postfix = postfix, has_header = has_header, header = header,
separate_rows = separate_rows, framed = framed,
separate_empty_lines = separate_empty_lines, justify = justify,
wrapfunc = wrapfunc, width = width)
return result
def ascii_table(rows,
sep = '-',
corner = '+',
delim = [' | '],
corner_delim = None,
prefix = u'| ',
postfix = u' |',
has_header = False,
header = None,
separate_rows = False,
framed = (True, True),
separate_empty_lines = True,
justify = 'right',
wrapfunc = lambda x:x,
width = None,
**kw):
result, max_width = tableinfo(
normalize(rows), sep = sep, corner = corner, delim = delim,
corner_delim = corner_delim,
prefix = prefix, postfix = postfix, has_header = has_header, header = header,
separate_rows = separate_rows, framed = framed,
separate_empty_lines = separate_empty_lines, justify = justify,
wrapfunc = wrapfunc, width = width)
return result
然后你可以像这样使用它:
import table
data = [
('id', 'now()', 'aaa'),
('28', '2012-03-01 14:24:02', u'To \N{INFINITY} and beyond'),
('77', '2012-03-01 14:24:02', u"All with me's meet"),
('89', '2012-03-01 14:24:02', u' that I can fashion fit \N{BLACK SMILING FACE}'),
('114', '2012-03-01 14:24:02', u'\N{LATIN CAPITAL LETTER OU}'),
('116', '2012-03-01 14:24:02', u'An extra wide unicode: \N{COMBINING CYRILLIC HUNDRED THOUSANDS SIGN}'),
('252', '2012-03-01 14:24:02', u'\N{THEREFORE}'),
]
print(table.ascii_table(data, has_header = True))
产生
+-----+---------------------+---------------------------+
| id | now() | aaa |
+-----+---------------------+---------------------------+
| 28 | 2012-03-01 14:24:02 | To ∞ and beyond |
| 77 | 2012-03-01 14:24:02 | All with me's meet |
| 89 | 2012-03-01 14:24:02 | that I can fashion fit ☻ |
| 114 | 2012-03-01 14:24:02 | Ȣ |
| 116 | 2012-03-01 14:24:02 | An extra wide unicode: ҈ |
| 252 | 2012-03-01 14:24:02 | ∴ |
+-----+---------------------+---------------------------+
请注意,对应于 id = 114 和 116 的行与其他行并不完全对齐。
(阅读 table.table 的文档字符串以获取有关可用参数的更多信息。)
关于python - 如何以人类可读的方式打印 MySQLdb unicode 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9516247/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt