Python Script для сортировки и переименования файлов - удаляет дубликаты - PullRequest
0 голосов
/ 01 сентября 2011

Я написал небольшой скрипт для переименования и сортировки файлов в той же папке, где находится скрипт.Он переименовывает файлы в целые числа (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 ]

2 голосов
/ 01 сентября 2011

Итак, вот пример, который копирует в подкаталог и не копирует файл .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 голос
/ 01 сентября 2011

Вы не можете переименовать один файл за другим, так как вы можете перезаписать уже отсортированные файлы во время процесса. Однако вы можете сначала использовать временные имена, а затем переименовать файлы в их окончательные имена за второй проход:

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))

(непроверенные)

0 голосов
/ 01 сентября 2011
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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...