0

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

我使用 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)

4

2 回答 2

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。实现这一点留给读者作为练习。

于 2012-11-21T21:53:18.763 回答
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))

希望这可以帮助

于 2012-11-21T21:56:44.690 回答