2011-09-01 4 views
0

스크립트가있는 폴더의 파일 이름을 바꾸고 정렬하는 데 필요한 작은 스크립트를 작성했습니다. 이 파일의 최종 수정에 따라 정수 (1, 2, 3, 4, ...)에 파일의 이름을 바꿉니다 : 내가 가지고 올 것 중에 최고였다파일을 정렬하고 이름을 바꾸는 Python 스크립트 - 중복 파일 제거

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로 명명 된 파일) 그냥 제거하는 것입니다. 어떻게 이런 일이 발생하지 않도록 할 수 있습니까 ?? 코드 또는 더 나은 대체 방법으로 할 수있는 수정이 있습니까 ???

+2

왜 이렇게해야합니까? 당신의 "어떻게?" "왜?"에 대한 대답으로 알려줄 것입니다. – MattH

+0

내 친구가 파일 (일종의 레코드 또는 문서 파일)이 들어있는 폴더가 있고 오래된 파일을 보관해야합니다. 어쩌면 다른 스크립트가이 오래된 파일에 추가하여 패턴이 새 파일을 구별하는 데 필요할 수 있습니다. 수정되었고, 나는 그 방식으로 이름을 바꾸는 것이 훨씬 쉬워 질 것이라고 생각했다. – amyassin

+1

확실히 mod 시간별로 정렬되는 파일 브라우저를 사용하는 것이 더 쉬울 까? – MattH

답변

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

(안된)

+0

좋은 아이디어! 도대체 어떻게 내 마음에 오지 않았어 ... thnx – amyassin

+0

덕분에 @ Niklas, 그것은 .pyc 파일을 피하기 위해 – amyassin

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

어떻게 그 일이 벌어지는 것을 막는가 ?? – amyassin

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

+1 일했습니다 ... 나는 그것에 대해 몰랐고 왜 스크립트의 다른 사본이 나타 났는지 궁금해. ... – amyassin

+0

@amyassin : ".pyc 파일을 피하는 것"이 ​​의미하는 바를 실제로 얻지 못합니까? 이 파일들은 CPython에 의해 일시적으로 생성되며 제거되면 기꺼이 재생성됩니다. –

+0

때때로 @Niklas @Niklas 때때로 정렬 작업을 수행 할 때 이름을 바꿀 때 새 이름이 지정되고 파일 이름대로 정렬되므로 다른 파일을 가져옵니다. - 스크립트의) ... 나는 그것에 대해 더 많은 것을 읽으 려하고있다. 그러나'x.startswith (sys.argv [0]) '에 의해 해결되었다 ... – amyassin

관련 문제