按照标题为python的顺序重命名文件

时间:2019-03-07 04:22:17

标签: python for-loop

我正在使用其他人帮助我执行的python脚本,将目录中的所有.jpg或.png文件重命名为我想要的顺序。 因此,如果目录中有20个.png文件,我想按1-20的顺序重命名它们。

我有这个脚本,我对此很满意。但是,仅指出我使用此脚本重命名的文件已损坏。

作为一个例子,当我将1.png重命名为testImage1.png时,我实际上是将testImage10.png重命名为testImage1.png。我通过创建5个具有相同内容的文本文件来对脚本进行测试,但是文本文件1-3中放置了不同的内容以跟踪重命名后的内容。果然,一切都混了。

import os
import sys

source = sys.argv[1]
files = os.listdir(source)
name = sys.argv[2]

def rename():
    i = 1
    for file in files:
        os.rename(os.path.join(source, file), os.path.join(source, name+str(i)+'.png'))
        i += 1

rename()

我花时间尝试使用我(有限的)python知识来创建一系列的if / elif语句来筛选并按顺序使用正确的名称重命名文件。

def roundTwo():
    print('Beginning of the end')
    i = 1
    for root, dirs, files in os.walk(source):
            for file in files:
                    print('Test')
                    if source == 'newFile0.txt' or 'newFile0.png':
                            os.rename(os.path.join(source, file), os.path.join(source, name+str(i)+'.txt'))
                            print('Test1')
                            i += 1
                    elif source == 'newFile1.txt' or 'newFile1.png':
                            os.rename(os.path.join(source, file), os.path.join(source, name+str(i)+'.txt'))
                            print('Test2')
                            i += 1


roundTwo()

我做了很多搜索以包括Re或fnmatch,但是没有什么比我想要的要精确的多了。也许我使用错误的术语进行搜索?任何见识都会有所帮助!

2 个答案:

答案 0 :(得分:1)

如果您的问题出在110上,则可以使用natural sorting。对变量files进行如下排序:

from natsort import natsorted, ns
natsorted(files, alg=ns.IGNORECASE)

示例:

>>> x = ['a/b/c21.txt', 'a/b/c1.txt', 'a/b/c10.txt', 'a/b/c11.txt', 'a/b/c2.txt']
>>> sorted(x)
['a/b/c1.txt', 'a/b/c10.txt', 'a/b/c11.txt', 'a/b/c2.txt', 'a/b/c21.txt']

>>> natsorted(x, alg=ns.IGNORECASE)
['a/b/c1.txt', 'a/b/c2.txt', 'a/b/c10.txt', 'a/b/c11.txt', 'a/b/c21.txt']

答案 1 :(得分:0)

如果所有文件都具有某种基本名称,则可以修改第一个函数以提取分配给图像的编号

baseName='testImage'
def rename():
    for file in files:
        number=file[len(baseName):file.find('.png')]
        os.rename(os.path.join(source, file), os.path.join(source, name+number+'.png'))

希望有帮助