【问题标题】:If "Part[Digits].rar" Exists In Filename如果文件名中存在“Part[Digits].rar”
【发布时间】:2012-04-06 22:06:48
【问题描述】:

所以我正在寻找一个脚本来返回带有文件名和扩展名的副本,这样我就可以更改名称中的文件名(大写、删除点、破折号等),然后只需添加扩展名即可go(在某些时候,我希望将它放入带有 GUI 的东西中)。

我不确定最好的方法是什么,但我想拥有它,因此它需要扩展名(最后一个 .ext),除非文件名以“部分[任意位数,任意1-任意数字中的零的个数].rar",然后将最后两部分作为"扩展名"。

我不喜欢这种特定的方法。但是,我确实需要将它集成到当前脚本中(集成到我将用于其他所有内容的同一脚本中),并且我知道它需要以我有一个重复的名称结尾,即分机对。

我当前的代码:

import os, shutil, re
def rename_file (original_filename):
    name, extension = os.path.splitext(original_filename)    
    name = re.sub(r"\'", r"", name) # etc...more of these...
    new_filename = name + extension
    try:
        # moves files or directories (recursively)
        shutil.move(original_filename, new_filename)
    except shutil.Error:
        print ("Couldn't rename file %(original_filename)s!" % locals())
[rename_file(f) for f in os.listdir('.') if not f.startswith('.')]

如何使这个把“part[digits]”和.rar 作为“ext”的一部分而不是作为名称的一部分?

【问题讨论】:

  • 如何将“part[digits]”添加到扩展名而不是名称。

标签: python regex rename


【解决方案1】:

你可以用正则表达式代替splitext:

m = re.search(r'(.*?)((part\[\d+\])?\.rar)', original_filename)
name, ext = m.groups()[:2]

所以,例如:

>>> m = re.search(r'(.*?)((part\[\d+\])?\.rar)', 'name_part[23].rar')
>>> m.groups()[:2]
('name_', 'part[23].rar')

或者

>>> m = re.search(r'(.*?)((part\[\d+\])?\.rar)', 'name_no_parts.rar')
>>> m.groups()[:2]
('name_no_parts', '.rar')

这假定扩展名实际上是.rar。如果不是这种情况,调整正则表达式很容易。

【讨论】:

  • 谢谢,但你能告诉我如何调整它以适用于所有扩展吗??
  • 只需将“rar”更改为“.*”即可。仍然有一些极端情况会失败(例如,如果文件名只是“.rar”会发生什么?),但您必须决定如何处理它们,甚至是否需要。这看起来可能是一个供个人使用的实用程序脚本,在这种情况下,极端情况可能不是问题。
  • 我建议您阅读docs.python.org/library/re.html 以获取有关正则表达式的帮助。
猜你喜欢
  • 1970-01-01
  • 2018-10-29
  • 2016-12-18
  • 1970-01-01
  • 2012-06-17
  • 2017-09-19
  • 2017-12-15
  • 2013-03-10
  • 1970-01-01
相关资源
最近更新 更多