Python:使用文件包含的数字重命名文件夹中的所有文件

时间:2012-11-21 21:40:07

标签: python

我想写一个小脚本来管理我得到的一堆文件。这些文件具有复杂且不同的名称,但它们的名称中都包含一个数字。我想取这个数字,把它放在文件名前面,这样它们就可以在我的文件系统中逻辑列出。

我使用os.listdir获得了所有这些文件的列表,但我很难找到找到这些文件中的数字的方法。我已经检查了正则表达式,但我不确定这是否是正确的方法!

示例:

import os
files = os.litdir(c:\\folder)
files
['xyz3.txt' , '2xyz.txt', 'x1yz.txt']`

基本上,我最终想要的是:

1xyz.txt
2xyz.txt
3xyz.txt

我到目前为止所遇到的是在列表文件中找到这些数字(1,2,3)

2 个答案:

答案 0 :(得分:2)

此(未经测试的)代码段应显示正则表达式方法。编译模式的search方法用于查找数字。如果找到,则将数字移动到文件名的前面。

import os, re

NUM_RE = re.compile(r'\d+')

for name in os.listdir('.'):
    match = NUM_RE.search(name)
    if match is None or match.start() == 0:
        continue  # no number or number already at start
    newname = match.group(0) + name[:match.start()] + name[match.end():]
    print 'renaming', name, 'to', newname
    #os.rename(name, newname)

如果此代码在生产中使用而不是作为家庭作业,则有用的改进是将match.group(0)解析为整数并将其格式化为包含多个前导零。这样foo2.txt将变为02foo.txt并在12bar.txt之前排序。实现这一点是留给读者的练习。

答案 1 :(得分:0)

假设文件名中的数字是整数(未经测试的代码):

def rename(dirpath, filename):
    inds = [i for i,char in filename if char in '1234567890']
    ints = filename[min(inds):max(inds)+1]
    newname = ints + filename[:min(inds)] + filename[max(inds)+1:]
    os.rename(os.path.join(dirpath, filename), os.path.join(dirpath, newname))

def renameFilesInDir(dirpath):
    """ Apply your renaming scheme to all files in the directory specified by dirpath """

    dirpath, dirnames, filenames = os.walk(dirpath):
    for filename in filenames:
        rename(dirpath, filename)
    for dirname in dirnames:
        renameFilesInDir(os.path.join(dirpath, dirname))

希望这有帮助