【问题标题】:Python - sorting incremented filesPython - 对增量文件进行排序
【发布时间】:2015-01-08 10:27:24
【问题描述】:

我有许多文件夹,其中包含多个版本化文件。以下是示例文件:

Cat_Setup_v01.mb

Cat_Setup_v18.mb

版本号有两个字符的填充。这样,我可以轻松地使用以下方法对文件进行排序:

 listFiles = glob.glob( myPath + "*.m*") # Retrieve files in my folder    
 listFiles.sort()    

不幸的是,我有一些文件有一百多个版本。因此,我的排序方法被 v1XX 破坏了,因为它们在 v09 和 v10 之间排序。

有没有一种有效的方法可以以正确的方式对文件进行排序,而无需全部重命名并更改它们的填充?

sorted(versionNumber, key=int) 结合一些拆分字符串操作可能是一个有趣的线索,但我担心它会太麻烦。

我不太了解 Python,因为它似乎是一种有趣的语言,有很多可能性,我很确定有一种更有效的方法。

干杯

【问题讨论】:

  • 我知道这不是您要问的,但我会编写一个 Python 脚本,自动将所有文件名从 v01 更改为 v0001 .
  • 我的下一个任务是更改使用 Python 脚本制作的版本填充。但是,我在这里有大约 400 个包含版本文件的文件夹,其中一些文件目前被其他人使用。所以,我会让他们保持原样并使用@dragon2fly 回答。

标签: python file sorting version


【解决方案1】:

正则表达式可能会对您有所帮助。

import re

file=["Cat_Setup_v91.mb", "Cat_Setup_v01.mb", "Cat_Setup_v119.mb"]

print sorted(file, key=lambda x: int(re.findall("(?<=v)\d+", x)[0]))

给出输出:

['Cat_Setup_v01.mb', 'Cat_Setup_v91.mb', 'Cat_Setup_v119.mb']

更新:根据@Rawing 评论将"(?&lt;=v)\w*" 更改为"(?&lt;=v)\d+"

【讨论】:

  • 如果文件名中有一个v 字符后跟一个非数字,这将崩溃。如果您要将其转换为数字,请搜索 以查找数字:(?&lt;=v)\d+
  • 如果我理解和测试正确int(re.findall("(?&lt;=v)\w*", x)[0] 将版本号作为整数返回。而sorted() 使用这个 int 作为排序的键。编辑:@dragon2fly @Rawing 就像一个魅力,干杯伙计们。 Python 不是一门有趣的语言,它是一种了不起的语言。
  • @DrHaze 你是对的。它首先搜索字符 v 后面的数字,然后返回结果列表。由于只有一个结果,所以[0] 会从列表中取出那个数字的字符串,然后int() 会转换它。
猜你喜欢
  • 2017-06-23
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2011-08-20
  • 2015-06-14
相关资源
最近更新 更多