首页 > 解决方案 > Python:在逗号前写入具有恒定字符数的数字

问题描述

我尝试从存放在公共目录中的一些 png 文档(我自己创建的)构建一个 gif 文件(命名为 say name)。我从终端使用的命令如下:

转换 -delay 2 -loop 0 *.png -scale 960x520 name.gif

上面的命令将按字典顺序使用所有 png 文件(这是命令的“* .png”部分),但我的问题是我无法以好的方式对文件进行排序。我所有的文件都代表某个时间 t 的函数图,所以我将这些文件命名为“t.png”,其中 t 的范围是 1 到 100,比如说;例如,“文件 1.png”出现在“10.png”之后,因为“。” 出现在“0”之后,依此类推。

解决它的一种方法是将 1 到 100 的每个数字 t 以相同的格式写入,例如:001、002、003、004、005、006、007、008、009、010、011、012 等。即,我想使用相同数量的字符(这里是 3)来写数字 t。由于这个 t 的范围可以从 1 到一个任意大的整数,我宁愿避免在我的代码中添加一些东西来检测写入 t 所需的字符数,然后添加剩余的 0。此外,我相信有一种非常简单的方法可以随心所欲地写 t,即使我还没有弄清楚(我也没有在其他地方找到有用的东西)。

此外,如果有人有另一种方法来正确排序我的图表,他或她将非常受欢迎(例如,我尝试使用文件的创建日期,因为 t 小于 t' 意味着 t.png 已经在 t'.png 之前创建,但到目前为止还没有运气......)。

提前致谢 !

标签: pythonformatgif

解决方案


有两种方法可以解决这个问题。首先,您可以按照您的建议在文件名中添加前导零。您可以通过格式化数字来做到这一点,如下所示:

>>> t = 32
>>> f"{t:03d}.png"
'032.png'

注意f格式字符串的前缀。这很重要。离开它,这会发生:

>>> "{t:03d}.png"
'{t:03d}.png'

如果解释器抱怨f你使用的是 Python 3.6 或更早版本,你需要这样做:

>>> "{0:03d}.png".format(t)
'032.png'

另一种方法是像您一直在做的那样创建您的文件名,然后通过在中指定排序规则将它们排序为您想要的顺序key

>>> filelist = ["1.png","2.png","10.png","100.png"]
>>> sorted(filelist, key=lambda f: int(f.partition(".")[0]))
['1.png', '2.png', '10.png', '100.png']

而不仅仅是采用默认的排序顺序:

>>> sorted(filelist)
['1.png', '10.png', '100.png', '2.png']

推荐阅读