Python脚本排序和重命名文件 - 去重

0 投票
3 回答
2887 浏览
提问于 2025-04-17 01:02

我写了一个小脚本,用来重命名和排序与脚本在同一个文件夹里的文件。这个脚本会根据文件最后修改的时间,把文件重命名成整数(1, 2, 3, 4, ...):

import os
import sys
def gtime(nam):
    return os.path.getmtime('./'+nam)
files = os.listdir('.')
files.remove(str(sys.argv[0])[2:])
files = sorted(files, key=gtime)
for fi in range(len(files)):
    os.rename('./'+files[fi], './'+str(fi+1))

这是我想到的最好的办法……问题是如果有重复的文件名(比如已经有一个文件叫1,可能是之前排序时留下的),它就会直接把这个文件删掉……我该怎么防止这种情况发生呢?有没有什么方法可以修改代码,或者有没有更好的办法呢??

3 个回答

0

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,不知道该怎么解决。比如,有人可能在使用某个特定的功能时,发现它并没有按照预期的方式工作。这种情况下,通常我们会去查找相关的资料或者在网上寻求帮助,比如在StackOverflow这样的平台上提问。

在提问的时候,清楚地描述问题是非常重要的。你需要告诉别人你在做什么,遇到了什么具体的错误,或者你希望实现什么样的功能。这样,其他人才能更好地理解你的问题,并给出有效的建议或解决方案。

有时候,问题的解决可能需要一些调试的过程。调试就是找出程序中哪里出了问题,通常需要你仔细检查代码,看看是否有拼写错误、逻辑错误或者是使用了不正确的参数等。

总之,遇到问题时不要着急,耐心地分析和查找资料,通常都能找到解决办法。

import os.path
for fi in range(len(files)):
    if os.path.exists(str(fi+1)):
        print("Prevent that from happening") # whatever you want to do here
    else:
        os.rename(files[fi], str(fi+1))
2

这里有一个例子,它会把文件复制到一个子目录,并且避免复制你脚本的 .pyc 文件。

import os, sys
from os.path import exists, isfile, getmtime, join as pjoin
from shutil import copyfile

targetdir='process'
stub='inputfile'

if not exists(targetdir):
  os.mkdir(targetdir)

files = [ x for x in os.listdir('.') if isfile(pjoin('.',x)) and not x.startswith(sys.argv[0]) ]
pad = len(files)/10 + 1
for i,f in enumerate(sorted(files,key=lambda x: getmtime(pjoin('.',x)))):
  copytarget = pjoin('.',targetdir,"%s-%0.*d" % (stub,pad,i))
  print "Copying %s to %s" % (f,copytarget)
  copyfile(f,copytarget)
1

你不能一个接一个地重命名文件,因为这样可能会在过程中覆盖掉已经排序好的文件。不过,你可以先用临时的名字来重命名,然后再在第二步中把文件改成最终的名字:

import os
import sys
def gtime(nam):
    return os.path.getmtime('./'+nam)
files = os.listdir('.')
files.remove(str(sys.argv[0])[2:])
files = sorted(files, key=gtime)
for fi, file in enumerate(files):
    os.rename(file, str(fi+1)+".tmp")
for fi in range(len(files)):
    os.rename(str(fi+1)+".tmp", str(fi+1))

(未经测试)

撰写回答