我在目录中有一堆文件。它们将使用以下名称自动下载:
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")
答案 0 :(得分:4)
前三行是正确的。
但是,要使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")