【问题标题】:Python string formatting with 'n' number of digits (when using keys) Python 2.7 [duplicate]使用'n'位数的Python字符串格式化(使用键时)Python 2.7 [重复]
【发布时间】:2018-05-10 05:39:54
【问题描述】:

要在字符串格式中有特定位数,我知道可以通过这种方式完成:

In [18]: hours = 01

In [19]: "%.2d" %(hours)
Out[19]: '01'

In [20]: "%.2f" %(hours)
Out[20]: '1.00'

但我的情况有点不同。我使用特定的键来表示值,例如:

for filename in os.listdir('/home/user/zphot_01/')

这里我想为'01'设置不同的值,即

for filename in os.listdir('/home/user/zphot_{value1}/'.format(value1=some_number):

当我对some_number = 01使用上述方法时,它没有考虑0,所以我的文件夹无法识别。

编辑:

大多数答案只针对一个值,但是,我希望有多个键值,即:

for filename in os.listdir('/home/user/zphot_{value1}/zphot_{value2}'.format(value1=some_number1,value2=some_number2)). 

【问题讨论】:

  • 请使用新的字符串格式,这样问题就不会很多了。
  • 你可以使用'1'.zfill(2)
  • @user1767754:能给我一个链接吗
  • '{value:02d}'.format(value=1)
  • 或者您可以升级到 Python 3.6 并使用 f 字符串,例如 f'{value1:02}'

标签: python string-formatting


【解决方案1】:

有很多方法。看this answer

这是我的主观意见,但我已按最坏到最好的顺序排列它们。

>>> '1'.zfill(2)
'01'
>>> '%02d' % 1
'01'
>>> '%02s' % '1'
'01'
>>> '{0:0>2}'.format(1)
'01'
>>> '{0:02d}'.format(1)
'01'
>>> '{:02d}'.format(1)
'01'
>>> f'{1:02}'
'01'

然后,你必须将它与你当前的字符串结合起来,没有什么复杂的。

编辑:

我不确定 OP 对他的编辑到底要问什么,但是:

for filename in os.listdir('/home/user/zphot_{value1}/zphot_{value2}'.format(value1=some_number1,value2=some_number2)).

可以通过很多方式改变,我举几个例子:

>>> number_first, number_second = '1', '2'
>>> '/home/user/zphot_{value1}/zphot_{value2}'.format(value1 = number_first.zfill(2), value2 = '2'.zfill(2))
'/home/user/zphot_01/zphot_02'
>>> '/home/user/zphot_{}/zphot_{}'.format('1'.zfill(2), number_second.zfill(2))
'/home/user/zphot_01/zphot_02'
>>> f'/home/user/zphot_{{number_first:02}}/zphot_{2:02}'
'/home/user/zphot_01/zphot_02'    
>>> '/home/user/zphot_%02d/zphot_%02s' % (1, '2')
'/home/user/zphot_01/zphot_02'
>>> '/home/user/zphot_{:02d}/zphot_{:02d}'.format(1, 2)
'/home/user/zphot_01/zphot_02'

等等

【讨论】:

  • 可爱,谢谢你的欺骗目标。
  • @cᴏʟᴅsᴘᴇᴇᴅ,我的英语不是很好,翻译认为你会用“欺骗目标”杀死某人......但是,我想你不客气。
  • 我想将它用于多个值
  • @ThePredator,你能解释一下吗?我不明白你的意思。
  • 我已经编辑了我的问题,请看
【解决方案2】:
print("{0:02}".format(1))
>>0001

刚刚从其他答案和评论者那里了解到,我们不需要zfill,但可以使用表达式:02 来提供填充。

扩展到更多职位

print("{0:02}_{1:02}".format(1, 2))
>>0001_0002

【讨论】:

  • 我喜欢脾气暴躁的投票者
  • 我正要迭代地让我的答案变得更好
  • 不需要单独的.zfill 呼叫:.format 可以执行该操作。例如,"{0:02}".format(1)
  • 嗯,你的答案现在是 DavidZ 的抄本……
  • 仍在迭代中,我不是反对者....但请记住,将其他人建议的解决方案作为您的解决方案对其他人有点不公平。
【解决方案3】:

new format string syntax 允许您使用格式说明符,就像旧的基于 % 的语法一样。您可以使用的格式说明符是相似的,并非在所有情况下都完全相同(我认为),但据我所知,您可以用旧语法做的任何事情也可以用新语法完成。

您所要做的就是将格式说明符放在格式表达式中,并用冒号与字段名称/编号分隔。在这种情况下,您可以使用 {value1:02d},其中 02d 是获取整数 (d) 的零填充 (0) width-2 (2) 表示形式的代码。

【讨论】:

  • 这肯定是一种比另一种更 Pythonic 的方式。
  • 如何在 Python 2.7 中进行?
  • 新的字符串格式代码也适用于 Python 2.7。
  • @DavidZ:没有!它仍然无法识别01 中的0
  • @ThePredator 0 应该是什么意思?你说的是什么时候设置hours = 01?你应该知道,在代码中,101 代表的值完全相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
相关资源
最近更新 更多