2014-03-05 1 views
2

파일을 삭제파이썬 os.rename 모듈은 내가 파이썬에서 파일의 큰 무리의 이름을 바꿀 수있는 작은 프로그램을 작성했습니다

#!/usr/local/bin/python3 

import os 
import glob 
import sys 

script, arg1 = sys.argv 
f = open(arg1) 

# Create a filelist using glob 
filelist = glob.glob('*.avi') 
filelist.sort() 

for filename in filelist: 
    print(filename) 
    # To keep the file ending 
    os.rename(filename, f.readline()[:-1]+filename[-4:]) 

그것은 인수로 주어집니다 TXT 파일에서 이름을 읽고 다른 avi 파일의 이름을 바꿉니다. 하지만 시작 번호 '102'가 누락 된 파일이 하나 있었으므로 이제 '102'의 전체 주문이 잘못되었습니다. 이제이 파일을 다시 실행하고 내 txt 파일에서 102 행을 삭제하면 102에서 온 모든 파일이 마지막 파일을 제외하고 삭제됩니다.
이 작은 버그를 수정하는 방법을 알고이 일이 어떻게 발생하는지 설명 할 수 있습니다.

--- 편집 ---

내 텍스트 파일의 짧은 조각이

snip 
099. Abenteuer in Ido 
100. Corsa, der junge Rebell 
101. Unser Papa ist ein Held 
102. Die Gesetze des Vertrauens 
103. Um acht in Spider's Cafe 
104. Ruffy gegen Vivi 
105. Aufruhr in Rainbase 
snip 

목록은 내가 os.rename의 문제 때문에 300 개 파일을 가지고 최대 400으로 진행

일어나지 않을거야. 번호 102의 파일은 처음 스크립트를 실행했을 때 존재하지 않았으므로 위의 모든 내용은 잘못된 숫자입니다. 파일 102를 추가하고이 스크립트를 다시 실행하려고합니다.

파일은 내가 다시 실행하기 전에 :

... 
100. Corsa, der junge Rebell.avi 
101. Unser Papa ist ein Held.avi 
102. Die Gesetze des Vertrauens.avi 
103. Um acht in Spider's Cafe.avi 
104. Ruffy gegen Vivi.avi 
105. Aufruhr in Rainbase.avi 
... 

후 파일 : 당신이 더 이상 정보가 필요하면

... 
100. Corsa, der junge Rebell.avi 
101. Unser Papa ist ein Held.avi 
301. Sogeking, der Held der Stunde.avi 
... 

내가 그것을 제공 할뿐만 아니라 가능한 한 당신은 아마 더 적은이

+1

나는이 문제를 이해하지 못한다. 텍스트 파일의 내용, 스크립트를 실행하기 전에 존재하는 avi 파일의 목록 및 이후에 존재하는 avi 파일의 목록을 제공 할 수 있습니까? – Kevin

+0

예, 사용중인 목록이 매우 유용합니다. – StephenH

+0

시작하기 전에,이 줄을 치기 전에'os.rename (filename, f.readline() [: - 1] + filename [-4 :])'다음 디버그 문을 추가합니다 : 'temp = f .readline()' 'print filename, (temp + filename [-4 :])' 이것은 어떤 파일 이름이 처리되는지를 이해하는데 도움을 줄 것입니다. – StephenH

답변

0

줄을 파일에있는 파일보다. 유닉스 환경이라고 생각 하나?

readline

는이 문서에서 부작용 갖

f.readline() 파일에서 한 라인을 판독하는 단계; 개행 문자 (\ n)은 문자열의 끝에 남으며 파일이 개행에서 끝나지 않는 경우 파일의 마지막 줄인 줄에서만 생략됩니다. 그러면 반환 값이 명확합니다. f.readline()이 빈 문자열을 반환하면 파일의 끝 부분에 도달하는 반면 빈 줄은 '\ n'으로 표시됩니다. 단 하나의 줄 바꿈이 포함 된 문자열입니다.

os.rename이 문서에서이 부작용이 있습니다 dst이 존재하고 파일 인 경우, 유닉스에

를, 사용자가 권한이 자동으로 경우 대체됩니다.

당신은 아마 지금 잘못된 무슨 일이 일어나고 있는지 추측 할 수 있지만, 난 그냥 케이스에 맞추는 것 :

의 당신이 당신의 디렉토리에있는 5 개 개의 파일이 있다고 가정 해 봅시다 :

  • 해서 a.txt를
  • b.txt
  • c.TXT

그리고 당신의 입력 파일의, 당신은 단지 3 개 항목이

  • e.txt
  • d.txt :

    User1 
    User2 
    User3 
    

    을 기대는 a.txt는 등 User1.txt로 변경하려는 것입니다 물론, 그것은 모두 암시 적입니다.

    그래서, 스크립트는 다음 b.txtUser2.txt에, User1.txt에 다음 c.txtUser3.txt에를 a.txt의 이름을 바꿉니다.

    d.txt은 어떻게됩니까? 파일을 읽고 빈 문자열을 얻습니다. 그런 다음 원래 확장명을 파일에 추가하고 d.txt.txt으로 이름을 바꿉니다. 별로 유용하지 않습니다.

    이제 더 악화 되네 ... 이제 e.txt을 봅니다. readline()으로 파일을 다시 읽고 다른 빈 문자열을 얻습니다. 그런 다음 원래 확장명을 파일에 다시 추가하고 e.txt의 이름을 .txt으로 바꿉니다. 그 이름을 가진 파일이 이미 있기 때문에 삭제되고 이제는 d.txt이 완전히 사라집니다.

  • 0

    확인. 나는 Corley 덕분에 문제를 알게되었다. 내가 잃어버린 파일의 한 항목으로 프로그램을 다시 실행하면 Corley가 설명한대로 파일을 삭제할 이중 이름이 생깁니다. 나는 간단한 수

  • 003.temp.avi
  • 002.temp.avi
    • 001.temp.avi
    • i = 1 
      for filename in filelist: 
          os.rename(filename, str(i).zfill(4)+'temp'+filename[-4:]) 
          i+=1 
      
      을 내 모든 파일 이름을 변경 루프와 함께이 고정 ...

    등등. 그럼 내 초기 질문에 스크립트와 함께해야 파일처럼 이름을 바꿉니다.

    알아서 도와 주셔서 감사합니다.