我有一个字典和一个转换为字符串的日期时间对象。如何在同一行中打印日期时间字符串和字典中的几个项目?
例如:
dictionary = {"_source": {"host": "host", "type": "type"}}
datetime = '25-08-2017 10:26:11'
这就是我试图打印的内容:
print("%s %(host)s %(type)s" % (datetime,dictionary["_source"]))
在日期时间字符串上获取错误:
TypeError: format requires a mapping
谢谢!
答案 0 :(得分:6)
一种方法是为日期时间arg指定一个名称:
"{t} {host} {type}".format(t=datetime,**dictionary["_source"])
但实际上即使没有它也能正常工作
"{} {host} {type}".format(datetime,**dictionary["_source"])
虽然最好在格式化字符串imo
中使用命名值答案 1 :(得分:3)
最好使用format
方法:
>>> "{} {d[host]} {d[type]}".format(datetime, d=dictionary["_source"])
'25-08-2017 10:26:11 host type'
答案 2 :(得分:2)
像其他人一样,使用str.format()可能是最好的。方法str.format()与您的问题最接近的选项是代码 Violet Red建议answer:
"{} {host} {type}".format(datetime,**dictionary["_source"])
但如果您真的想要或需要使用旧的格式化方式(使用%
),那么您可以尝试其中一些选项:
将字符串分成两个或多个字符串
与他Eugene Yarmash中解释的answer一样,您不能将普通和映射格式说明符混合在同一个字符串中,但您可以将它分成两个(或更多)字符串,如下所示:
'%s' % datetime + ' %(type)s %(host)s' % dictionary["_source"]
这样可行,但是如果你想在中间打印datetime
(类似于这个'%(type)s %s %(host)s'
),或者你有更多的普通和映射格式说明符交织在一起(类似这样{{1 }})。您可以将'%s '%(type)s %s %(host)s' %s
分成多个字符串,如下所示:
'%(type)s %s %(host)s'
但是首先在字符串格式中没有任何意义。
首先应用映射而不是普通格式说明符
此方法解决了使用普通和映射格式说明符格式化字符串的问题。我将在OP的例子中解释这个方法。我们要格式化字符串'%(type)s' % dictionary["_source"] + ' %s ' % datetime + '%(host)s' % dictionary["_source"]
。就像我先说的那样,我们应用了映射格式说明符:
'%s %(type)s %(host)s'
如果我们这样做,它将打印出来:
print('%s %(type)s %(host)s' % dictionary["_source"])
这不起作用,但我们可以做的是在每个普通格式说明符中添加括号'{'type': 'type', 'host': 'host'} type host'
并使用()
更新我们的字典:
{'': '%s'}
这将打印出来:
print('%()s %(type)s %(host)s' % {'type': 'type', 'host': 'host', '': '%s'})
我们可以使用'%s type host'
轻松设置格式。
问题是如何% (datetime)
到你的字典。您有两个选项,可以使用函数或为字典对象定义类。
<强> 1。使用功能
{'': '%s'}
你这样使用它:
def ForFormat(x):
d = x.copy()
d.update({'': '%s'})
return d
结果正是我们想要的:
print('%()s %(type)s %(host)s' % ForFormat(dictionary["_source"]) % (datetime))
<强> 2。创建课程
'25-08-2017 10:26:11 type 45 host'
此处我们实际上并未将class FormatDict(dict):
def __missing__(self, key):
return '%s'
添加到字典中,而是更改其在字典中找不到密钥时调用的方法{'': '%s'}
,以便它将重新调整__missing__()
对于不在字典中的每个映射格式说明符。它的使用方式如下:
'%s'
它还打印出所需的结果:
print('%()s %(type)s %(host)s' % FormatDict(dictionary["_source"]) % (datetime))
答案 3 :(得分:1)
您不能在单个格式字符串中混合使用普通格式和映射格式说明符。你应该使用
"%s %s %s" % (param1, param2, param3)
或
"%(key1)s %(key2)s %(key3)s" % {"key1": val1, "key2": val2, "key3": val3}
在Python 3.6+中,您可以使用更加方便和有效的f-strings进行插值,例如:
f'{val1} {val2} {val3}'
其中替换字段是表达式在运行时评估。
答案 4 :(得分:0)
你可以试试这个:
dictionary = {"_source": {"host": "host", "type": "type"}}
datetime = '25-08-2017 10:26:11'
print("host {} type {} datetime {}".format(dictionary["_source"]["host"], dictionary["_source"]["type"], datetime))