我想在Python 3.6中仅使用一行登录来打印列表。目前,我的代码如下所示。
logger = logging.getLogger()
logger.setLevel(log_level)
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(log_level)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
ch.setFormatter(formatter)
logger.addHandler(ch)
# some codes in-between
num_list = [1, 2, 3, 4, 5]
logger.info("Numbers in num_list are: ")
for item in num_list:
logger.info(item)
我想得到的是
2018-07-23 17:29:30,200 - root - INFO - Numbers in num_list are: 1 2 3 4 5
但是,我会得到
2018-07-23 17:29:30,200 - root - INFO - Numbers in num_list are:
2018-07-23 17:29:30,200 - root - INFO - 1
2018-07-23 17:29:30,200 - root - INFO - 2
2018-07-23 17:29:30,200 - root - INFO - 3
2018-07-23 17:29:30,200 - root - INFO - 4
2018-07-23 17:29:30,200 - root - INFO - 5
我知道如果使用print
进行输出,我本可以使用print(item, end=" ")
来显式更改输出之后的内容。但是,日志记录似乎不会接受end
作为输入参数。
有人对我如何获得所需的输出有任何想法吗?非常感谢!
答案 0 :(得分:3)
您正在使用for循环,该循环遍历所有列表并一次尝试记录一次:logger.info("Numbers in num_list are: {}".format(' '.join(map(str, num_list))))
将它们全部一次发布
请参阅:https://docs.python.org/3/library/stdtypes.html?highlight=str#str.join
答案 1 :(得分:2)
输出流(由print
使用)和消息日志之间存在很大差异。流是一个字符序列(或二进制字符串的字节),可能恰好包含换行符。当您在终端上显示(或打印它们)时,这些换行符将被解释。
日志是消息的序列,每个消息都应该是原子的。一旦记录了一条消息,您将无法添加任何内容,而只能记录新消息。
因此,您必须首先完全构建您的消息,然后将其记录:
num_list = [1, 2, 3, 4, 5]
msg = "Numbers in num_list are: " + " ".join(num_list) # fully build the message
logger.info(msg) # and then log it
答案 2 :(得分:1)
我发现的另一个不错的捷径 here -
nums = [3, 87, 28, 25, 96]
logging.debug("Here are my favourite numbers: " + str(nums)[1:-1])
"""
Output:
Here are my favorite numbers: 3, 87, 28, 25, 96
"""
再使用 map
-
logging.debug("Favourite numbers are: ".join(map(str, nums))
答案 3 :(得分:0)
不完全是您想要的,但是更懒: 当您要创建一些快速调试时,它可能会很有用:
num_list = [1, 2, 3, 4, 5]
logger.info(str(("Numbers in num_list are: ",num_list))
输出:
('Numbers in num_list are: ', [1, 2, 3, 4, 5])
答案 4 :(得分:0)
Python 日志记录的一个重要特性是(可能很昂贵)字符串连接仅在日志记录级别意味着要输出消息时才执行。
但是,在以下代码中,始终执行 str()
、map()
和 join()
,如果日志记录级别高于 debug,则结果可能会被丢弃:
logging.debug("Favourite numbers are: ".join(map(str, nums))
我创建了一个小类,它允许像这样对序列进行直观的单行记录:
logging.debug("Favourite numbers are: %s", rstr(nums))
其中 rstr
类的定义如下:
class rstr:
"""Wrapper to recursively str()ise a list or tuple or set. The work is only
performed in the __str__ call so these objects 'cost' very little if they
are never actually used (e.g. as in a logger.debug() argument when the
message is never output."""
def __init__(self, seq):
"""Creates an rstr instance which will string-ise the argument when
called."""
self._seq = seq
def __str__(self):
"""String-ise and return the argument passed to the constructor."""
if isinstance(self._seq, list):
return "[" + self._str_items() + "]"
elif isinstance(self._seq, tuple):
return "(" + self._str_items() + ")"
elif isinstance(self._seq, set):
return "{" + self._str_items() + "}"
else:
return str(self._seq)
def _str_items(self):
"""Returns the string-ised forms of the items in the argument passed to
the constructor - no start/end brackets/braces."""
return ", ".join(map(str, self._seq))
如果需要,这显然可以完全递归,但为了清楚起见,此处显示了更简单的版本。