2011-01-20 6 views
0

파일 이름에 '.'이 있으면 throw 및 오류가 발생하는 스크립트를 실행하고 있습니다. 또는 그것에 '+', 그래서 나는 모든 '을 대체 스크립트를 만들려고 노력하고 있습니다.' '_'를 사용하면 '+'를 대체하여 올바르게 작동합니다. 그러나 '.' 내가 파일을 나누지 않으면 모든 파일이 삭제됩니다 !! 그래서 파일을 분할하려고했지만 지금은 스크립트가 실행되었다고하지만 '.'의 모든 파일이 아직 남아 있습니다 !!파일 이름 내에서 찾기 및 바꾸기

folder = "C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1" 

import glob, os 
for filename in glob.glob(os.path.join(folder, "*+*")): 
    os.rename(filename, filename.replace('+','_')) 

for root, dirs, filenames in os.walk(folder): # returms root, dirs, and files 
    for filename in filenames: 
     filename_split = os.path.splitext(filename) # filename and extensionname (extension in [1]) 
     filename_zero = filename_split[0] 
     extension = str.upper(filename_split[1]) 
     for filename_zero in glob.glob(os.path.join(filename_zero, "*.*")): 
      os.rename(filename_zero, filename_zero.replace('.','_')) 

가 사전에 감사합니다

여기 내 스크립트입니다!

답변

1

나는 코드의 논리를 이해하지 않습니다. 나는 인쇄 문 추가 :

folder = "C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1" 

import glob, os 
for filename in glob.glob(os.path.join(folder, "*+*")): 
    print "I rename '+' to '_' in\n"+filename 
    os.rename(filename, filename.replace('+','_')) 


print '\n\n---- Now, there after, are the filenames in \n  '+folder 


for root, dirs, filenames in os.walk(folder): # returms root, dirs, and files 
    for filename in filenames: 
     print '\nfilename==',filename 
     filename_split = os.path.splitext(filename) # filename and extension name (extension in [1]) 
     filename_zero = filename_split[0] 
     extension = str.upper(filename_split[1]) 
     print 'filename_zero==',filename_zero 
     print 'os.path.join(filename_zero, "*.*")==',os.path.join(filename_zero, "*.*") 
     print 'glob.glob(os.path.join(filename_zero, "*.*"))==',glob.glob(os.path.join(filename_zero, "*.*")) 
     for filename_zero in glob.glob(os.path.join(filename_zero, "*.*")): 
      print ' filename_zero in glob.glob(os.path.join(filename_zero, "*.*")) ==',filename_zero 
      os.rename(filename_zero, filename_zero.replace('.','_')) 

그리고 여기에 결과

I rename '+' to '_' in 
C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\+po.rt.hos.txt 
I rename '+' to '_' in 
C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\ar.am+is.doc 
I rename '+' to '_' in 
C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\ath+os.html 
I rename '+' to '_' in 
C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\d'a.rtagn+an 
I rename '+' to '_' in 
C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\dum+as.doc 
I rename '+' to '_' in 
C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\ki.kiouili.do+c 


---- Now, there after, are the filenames in 
    C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1 

filename== ar.am_is.doc 
filename_zero== ar.am_is 
os.path.join(filename_zero, "*.*")== ar.am_is\*.* 
glob.glob(os.path.join(filename_zero, "*.*"))== [] 

filename== arctic.txt 
filename_zero== arctic 
os.path.join(filename_zero, "*.*")== arctic\*.* 
glob.glob(os.path.join(filename_zero, "*.*"))== [] 

filename== ath_os.html 
filename_zero== ath_os 
os.path.join(filename_zero, "*.*")== ath_os\*.* 
glob.glob(os.path.join(filename_zero, "*.*"))== [] 

filename== atla.ntic.html 
filename_zero== atla.ntic 
os.path.join(filename_zero, "*.*")== atla.ntic\*.* 
glob.glob(os.path.join(filename_zero, "*.*"))== [] 

filename== d'a.rtagn_an 
filename_zero== d'a 
os.path.join(filename_zero, "*.*")== d'a\*.* 
glob.glob(os.path.join(filename_zero, "*.*"))== [] 

filename== dum_as.doc 
filename_zero== dum_as 
os.path.join(filename_zero, "*.*")== dum_as\*.* 
glob.glob(os.path.join(filename_zero, "*.*"))== [] 

filename== ki.kiouili.do_c 
filename_zero== ki.kiouili 
os.path.join(filename_zero, "*.*")== ki.kiouili\*.* 
glob.glob(os.path.join(filename_zero, "*.*"))== [] 

filename== _po.rt.hos.txt 
filename_zero== _po.rt.hos 
os.path.join(filename_zero, "*.*")== _po.rt.hos\*.* 
glob.glob(os.path.join(filename_zero, "*.*"))== [] 

glob.glob (os.path.join (filename_zero ". "))는 항상 존재를 [] os.path.join (파일 이름 _zero, ".")은 파일 이름이 아니며 경로가 아니므로 os.rename (filename_zero, filename_zero.replace ('.', '_' ')) 아무것도하지 마십시오. 그런데

, 난 당신이 IMO

for filename in os.listdir(folder): 
    if os.path.isfile(filename): 

이상으로

for root, dirs, filenames in os.walk(folder): 
    for filename in filenames: 

를 교체하는 것이 좋습니다 (이하 한 들여 쓰기가)

for filename in (f in os.listdir(folder) if os.path.isfile(f)): 

나는 생각 네가 한 길은 난관이다. 만약 내가 올바르게 이해한다면, 당신이하고 싶은 것은 실제로 확장자 앞에 점과 '+'를 대치하는 것입니다. 즉, 확장자와 확장자 사이에 분리 점을 대체하지 않고 파일 이름, 확장자의 '+'는 사용할 수 없습니다. 어쨌든, 확장 기능이 포인트와 '+'를 가지고 있다는 것은 의미가 없습니다.

그래서 glob를 사용해보십시오. 그러나 인격적 인 이유는 '.'의 특별한 경우 때문입니다. 확장을 구분 짓는, 글로브가 실제로 어떻게 그 목표를 위해 사용될 수 있는지 나는 모른다.

그래서 나는 다른 길로 가야한다고 생각합니다. 와일드 카드 패턴과 일치하는 모든 파일 이름을 verifiy로 검사하고 처리해야하는 올바른 파일 이름 만 반환하도록 glob을 만드는 대신 파일 이름 목록에서 반복하여 '+'와 '를 바꿔야합니다. ' 확장 전 부분에. 네, 여기에 점이없고 '+'가없는 파일 이름이있을 것입니다. 그리고 그것은 프로그램에 의해 헛된 일이 될 것입니다. 그러나 어쨌든, 동일한 작업이 덩어리로 장면 뒤에서 수행됩니다. 그래서 일에 반기를 들여 상상할 수있는 코드를 작성하는 것을 선호합니다.

다음 코드는 짧고 efficent 솔루션

folder = "C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1" 

import os 
separ = os.sep 

for n in os.listdir(folder): 
    print n 
    if os.path.isfile(folder + separ + n): 
     filename_zero, extension = os.path.splitext(n) 
     os.rename(folder + separ + n , folder + separ + filename_zero.replace('.','_').replace('+','_') + extension) 

print '\n--------------------------------\n' 
for n in os.listdir(folder): 
    print n 

아니라 결과

+po.rt.hos.txt 
ar.am+is.doc 
arctic.txt 
ath+os.html 
atla.ntic.html 
d'a.rtagn+an 
dum+as.doc 
ki.kiouili.do+c 

-------------------------------- 

arctic.txt 
ar_am_is.doc 
ath_os.html 
atla_ntic.html 
d'a.rtagn+an 
dum_as.doc 
ki_kiouili.do+c 
_po_rt_hos.txt 
+0

놀라운! 그런 좋은 대답을 해주셔서 너무 감사합니다 !! 나는 아직도 도움이되고 믿을 수 없을만큼 영리한 사이트의 모든 사람들이 얼마나 능가 할 수 없는지 !! (나와 떨어져서 명백하게!!) 감사!! –

1

os.walk 루프 내에서 glob을 사용하고 있으며 filename_zero 변수를 덮어 쓰는 이유는 무엇입니까? (테스트하지)

for root, dirs, filenames in os.walk(folder): 
    for filename in filenames: 
     filename_split = os.path.splitext(filename) # filename and extensionname (extension in [1]) 
     filename_zero = filename_split[0] 
     extension = filename_split[1].upper() 
     if "." in filename_zero: 
      os.rename(filename_zero, filename_zero.replace('.','_')) 

+0

난 그냥 바콜이 이미 가지고있는 스크립트와 내가 발견 된 일부 다른 코드의 frankenstine을 한 날 것으로 보인다 - 내가 뭘 하려는지 exstension에서 파일 이름을 분리하고 다음을 실행하고 그것을 대체하는 것입니다! –

+0

나는 이것을 지금 시도 할 것이다 - 고마워! \t 라인 \t 위치 \t 역 추적 \t \t \t \t \t C 메시지 \t 파일 이름 : \ 문서 및 설정 \ DuffA \ Mijn documenten \ Renaming.py –

+0

I 라인 25 (마지막 줄)에 오류가 \t WindowsError : [오류 2] 지정한 파일을 찾을 수 없습니다. –