25

我有以下 Python 代码(我使用的是 Python 2.7.X):

my_csv = '{first},{middle},{last}'
print( my_csv.format( first='John', last='Doe' ) )

我得到一个KeyError例外,因为没有指定“中间”(这是预期的)。但是,我希望所有这些占位符都是可选的。如果未指定这些命名参数,我希望删除占位符。所以上面打印的字符串应该是:

John,,Doe

是否有内置功能可以使这些占位符成为可选,还是需要一些更深入的工作?如果是后者,如果有人可以向我展示最简单的解决方案,我将不胜感激!

4

4 回答 4

22

这是一种选择:

from collections import defaultdict

my_csv = '{d[first]},{d[middle]},{d[last]}'
print( my_csv.format( d=defaultdict(str, first='John', last='Doe') ) )
于 2012-06-13T20:20:32.357 回答
10
"It does{cond} contain the the thing.".format(cond="" if condition else " not")

我想我会添加这个,因为自从提出问题以来它一直是一个功能,这个问题仍然在谷歌结果的早期弹出,并且这个方法直接内置在 python 语法中(不需要导入或自定义类)。这是一个简单的快捷条件语句。它们读起来很直观(保持简单),而且它们短路通常很有帮助。

于 2017-07-24T07:35:34.913 回答
5

这是使用字符串插值运算符的另一个选项%

class DataDict(dict):
    def __missing__(self, key):
        return ''

my_csv = '%(first)s,%(middle)s,%(last)s'
print my_csv % DataDict(first='John', last='Doe')  # John,,Doe

或者,如果您更喜欢使用更现代的str.format()方法,以下方法也可以使用,但在某种意义上不太自动化,因为您将提前明确定义每个可能的占位符(尽管如果需要,您可以DataDict.placeholders即时修改):

class DataDict(dict):
    placeholders = 'first', 'middle', 'last'
    default_value = ''
    def __init__(self, *args, **kwargs):
        self.update(dict.fromkeys(self.placeholders, self.default_value))
        dict.__init__(self, *args, **kwargs)

my_csv = '{first},{middle},{last}'
print(my_csv.format(**DataDict(first='John', last='Doe')))  # John,,Doe
于 2012-06-13T21:04:21.090 回答
0

我遇到了和你一样的问题,并决定创建一个库来解决这个问题:pyformatting
这是解决您的pyformatting问题的方法:

>>> from pyformatting import defaultformatter
>>> default_format = defaultformatter(str)
>>> my_csv = '{first},{middle},{last}'
>>> default_format(my_csv, first='John', last='Doe')
'John,,Doe'

唯一的问题是 pyformatting 不支持 python 2。pyformatting 支持 python 3.1+ 如果我看到任何关于需要 2.7 支持的反馈,我想我会添加该支持。

于 2020-09-06T17:26:56.203 回答