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

阿本

我的目录中有一堆文件。它们会自动下载并带有以下名称:

new.pdb
new(1).pdb
new(2).pdb and so on

我有一个像这样的实际文件名列表:

AAA
BBB
CCC

我想要一种在列表中使用文件的相应名称重命名文件的方式,其中new.pdb将为AAA.pdb,new(1).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 <variable> in <collection>构造起作用,<collection>需要将其作为集合。last_file是字符串,因此是字符的集合;并且一个字符不可能以结尾.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")

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章