Python 根据输入列表重命名文件

Python 根据输入列表重命名文件,python,regex,file,batch-file,rename,Python,Regex,File,Batch File,Rename,我在一个目录中有一堆文件。它们会自动下载,名称如下: new.pdb new(1).pdb new(2).pdb and so on 我有一个实际文件名列表,如: AAA BBB CCC 我想要一种在列表中使用相应名称重命名文件的方法,其中new.pdb将是AAA.pdb,new1.pdb将是BBB.pdb,依此类推。 如果你能在投票前给我一个提示,我将不胜感激。我已经尽力解决了这个问题,但没有成功。 到目前为止我已经试过了。但以下代码的问题是,一些文件的下载速度可能比之前启动的文件快。所以

我在一个目录中有一堆文件。它们会自动下载,名称如下:

new.pdb
new(1).pdb
new(2).pdb and so on
我有一个实际文件名列表,如:

AAA
BBB
CCC
我想要一种在列表中使用相应名称重命名文件的方法,其中new.pdb将是AAA.pdb,new1.pdb将是BBB.pdb,依此类推。 如果你能在投票前给我一个提示,我将不胜感激。我已经尽力解决了这个问题,但没有成功。 到目前为止我已经试过了。但以下代码的问题是,一些文件的下载速度可能比之前启动的文件快。所以它没有像我想的那样重命名

    infiles = filter(os.path.isfile, os.listdir(os.getcwd()))
    infiles = [os.path.join(os.getcwd(), f) for f in infiles] 
    infiles.sort(key=lambda x: os.path.getmtime(x))
    last_file = infiles[-1]
    if rename_files.endswith(".pdb"):
        os.rename(last_file, directory_name+".pdb")

前三行是正确的

但是,要使for in构造起作用,需要是一个集合。最后一个文件是字符串,因此是字符的集合;而且单个字符不可能以.pdb结尾

假设rename_files是新名称的列表,则在前三行之后需要:

infiles = (infile for infile in infiles if infile.endswith(".pdb"))
for infile, outfile in zip(infiles, rename_files):
    os.rename(infile, outfile + ".pdb")
zip将从列表中创建一个对列表,因此您首先找到所有pdb文件,将它们与新名称配对,然后根据对重命名每个文件

编辑:如果要按文件名而不是原始的mtime,则需要提取该数字并按其排序:

def get_rank(infile):
    m = re.search(r'(?:\((\d+)\))[^()]*', infile)
    if m:
        return int(m.group(1))
    return 0 
infiles = filter(os.path.isfile, os.listdir(os.getcwd()))
infiles = [os.path.join(os.getcwd(), f) for f in infiles if f.endswith('.txt')]
filerank = (get_rank(infile) for infile in infiles)
renames = zip(filerank, infiles, rename_files)
renames.sort(key=lambda x: x[0])
for _, infile, outfile in renames:
    os.rename(infile, outfile + ".pdb")

你有last_file=infles[-1],然后你试着用last_file中的for rename_文件在这个单一路径上循环:我认为这与你在问题文本中描述的不一样。for loop是我稍后尝试的东西,我想看看它是否有任何不同。谢谢你的接球@dawgSo它会根据修改的日期重新命名,对吗?有什么方法可以根据文件名重命名吗?例如,由于file1在file2之前开始下载,但其规模很大,因此在file2之后完成下载,因此此方法将file2视为file1,因为它首先完成下载。我为我笨拙的英语感到抱歉。