Python을 사용하여 파일 이름을 바꾸는 방법


답변:


578

사용 os.rename:

import os

os.rename('a.txt', 'b.kml')

52
파일이 작업 디렉토리에 없으면 전체 경로가 필요합니다.
EndermanAPM

정말, 3.7 우분투, 내가 상대 경로를 사용하여 작동
toing_toing

2
@toing_toing 물론 작동하지만, 아마도 현재 디렉토리를 알고 있어야하며 상대 경로를 지정하거나 절대 경로 (예 : C:/folder/file.txtWindows 또는 /home/file.txtLinux / MacOS)를 사용해야합니다 .
Alex P.

이것이 유닉스 계열 시스템의 파일을 자동으로 덮어 쓰지만 OSErrorWindows 시스템 에서는 실패한다는 점은 주목할 가치가 있습니다. os.path.exists이름을 바꾸기 전에 대상이 존재하는지 확인하는 데 사용해야합니다. 이로 인해 "사용 시간을 확인하는 시간"버그가 발생하지만 문제가 발생하지는 않습니다. (나는 이것을 둘러싼 쉬운 방법이 없다- 여기를 참조 하십시오 .
AnnanFay

2
사용자가 실제로 모든 운영 체제에서 파일을 교체하려는 경우os.replace
LucG

73

파일이 디렉토리 안에있을 수 있습니다.이 경우 경로를 지정하십시오.

import os
old_file = os.path.join("directory", "a.txt")
new_file = os.path.join("directory", "b.kml")
os.rename(old_file, new_file)

49
import shutil

shutil.move('a.txt', 'b.kml')

파일 이름을 바꾸거나 파일을 이동하는 데 사용됩니다.


32
shutil.move원자 연산이 아니기 때문에 좋은 옵션이 아닙니다. 예를 들어, 파일이 열려 있으면을 사용하여 파일 shutil.move을 만들지 만 파일을 new_name삭제하지 old_name않으므로 두 파일이 남습니다. os.rename반면에 아무것도하지 않을 것인데, 이것이 더 좋은 선택 입니다. 을 사용하면 shutil.move오류가 발생하더라도 여전히 악성 파일을 확인하고 삭제하는 것에 대해 걱정해야합니다. 더 나은 도구가 존재할os.rename 때 가치가 없습니다 .
mvbentes

34

파이썬 3.4 부터 pathlib 모듈을 사용하여 이를 해결할 수 있습니다 .

이전 버전 인 경우 여기에 있는 백 포트 버전을 사용할 수 있습니다.

루트 경로에 있지 않다고 가정하고 이름을 바꾸려는 전체 경로를 제공해야한다고 가정 해 보겠습니다.

some_path = 'a/b/c/the_file.extension'

따라서 경로를 가져 와서 Path객체를 만들 수 있습니다 .

from pathlib import Path
p = Path(some_path)

우리가 지금 가지고있는이 개체에 관한 정보를 제공하기 위해, 우리는 그 개체를 추출 할 수 있습니다. 예를 들어 파일 이름을에서 the_file로 수정하여 파일 이름을 바꾸려는 경우 파일 the_file_1이름 부분을 가져올 수 있습니다.

name_without_extension = p.stem

그리고 여전히 확장을 손에 쥐십시오.

ext = p.suffix

간단한 문자열 조작으로 수정을 수행 할 수 있습니다.

파이썬 3.6 이상은 f- 문자열을 사용합니다!

new_file_name = f"{name_without_extension}_1"

그렇지 않으면:

new_file_name = "{}_{}".format(name_without_extension, 1)

이제 rename생성 한 경로 객체 에서 메소드를 호출하고 ext원하는 올바른 이름 바꾸기 구조를 완성하기 위해 를 추가하여 이름 바꾸기를 수행 할 수 있습니다 .

p.rename(Path(p.parent, new_file_name + ext))

더 간단하게 단순성을 보여주기 위해 :

파이썬 3.6 이상 :

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, f"{p.stem}_1_{p.suffix}"))

Python 3.6보다 작은 버전은 대신 문자열 형식 메소드를 사용합니다.

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, "{}_{}_{}".format(p.stem, 1, p.suffix))

3
수락 된 답변 대신 왜 이렇게 하시겠습니까? 훨씬 더 복잡한 것 같습니다
rbennell

19
@rbennell,이 답변의 대부분은 설명입니다. 대답은 실제로 마지막 세 줄입니다. 또한, 바로 그 이름 변경에 대한 대답이 명시 적으로 만들어졌습니다. 이 답변은 파일의 경로 나 이름에서 원하는 부분을 유지하기 위해 파일 이름을 조작하는 방법을 보여주는 방법을 제공합니다. 또한 pathlib라이브러리는 python 3.4에 도입되었으므로 여기에 답을 공유하면 더 복잡한 요구 사항에 대한 다목적 성과 사용법을 보여주는 견고한 모듈에 대한 노출을 제공합니다.
idjaw

4
@idjaw 감사합니다. 귀하의 의견은 초보자의 기본적인 질문에 대한 좋은 답변입니다. 왜 그렇게 했습니까? . 또한 인터넷에서 종종 무지한 것으로 간주되는 것에 대한 적대적이지 않은 접근 방식을 보는 것이 상쾌합니다.
Igor V.

3
@ SasukeUchiha- 여기서{} 읽을 수있는 문자열 형식 입니다. 궁극적으로 발생하는 것은 get이 메소드에 전달 된 변수로 대체된다는 것입니다. 그래서 첫 번째 는 안에있는 것을 유지하고 두 번째는 단순히 두 번째 논쟁을가 집니다. {}format{}name_without_extension1
idjaw

3
f- 문자열을 사용하면 훨씬 간단 해집니다. pathlib 반입 경로에서 P = 패스 (some_path) 버전 = 1 p.rename (경로 (p.parent, F "p.stem {} _ {버전}"+ p.suffix))
Liquidgenius


8

사용하십시오 os.rename. 그러나 두 파일의 전체 경로를 함수에 전달해야합니다. a.txt바탕 화면에 파일이 있으므로 이름을 바꾼 파일도 모두 제공해야합니다.

 os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')

1
"해야합니다"는 사실이 아닙니다. 항상 상대 파일 이름을 절대 파일 이름으로 대체 할 수 있으며 그 반대도 마찬가지입니다. 일반적으로 초보자에게 물린 것은 상대 파일 이름이 현재 작업 디렉토리와 어떤 관련이 있는지 이해하지 못한다는 것입니다.
tripleee

3
import os

# Set the path
path = 'a\\b\\c'  
# save current working directory
saved_cwd = os.getcwd()
# change your cwd to the directory which contains files
os.chdir(path)
os.rename('a.txt', 'b.klm')
# moving back to the directory you were in 
os.chdir(saved_cwd)

1
이 방법으로 조심하십시오. 당신은 항상 할 수 chdir()는 UNC을 때 디렉토리로, 예를 들어, 어떤 Windows에서 어떻게됩니까? 그리고 chdir()부작용이 있습니다. 차라리 필요한 경로를 os.rename()직접 지정하고 싶습니다 chdir().
JonBrave

0

os.system을 사용하여 터미널을 호출하여 작업을 수행 할 수 있습니다.

os.system('mv oldfile newfile')

예, 이것은 mv파일을 이동 / 이름 바꾸기하는 유닉스 내장 명령 행 프로그램 과 마찬가지로 유닉스 기반 머신에서만 작동 합니다.
Mikhail Geyer

8
멀티 플랫폼 방식으로 파이썬에서 터미널을 호출하고 UNIX 전용 명령을 정의하는 이유는 무엇입니까?
EndermanAPM

0
import os
import re
from pathlib import Path

for f in os.listdir(training_data_dir2):
  for file in os.listdir( training_data_dir2 + '/' + f):
    oldfile= Path(training_data_dir2 + '/' + f + '/' + file)
    newfile = Path(training_data_dir2 + '/' + f + '/' + file[49:])
    p=oldfile
    p.rename(newfile)

1
경로 구분자로 하드 코딩 포워드 슬래시와 구식 os.path을 현대식으로 혼합하는 pathlib것은 상당히 유쾌합니다. pathlib대신에 끝까지 가십시오 .
tripleee

0
import shutil
import os

files = os.listdir("./pics/") 

for key in range(0, len(files)):
   print files[key]
   shutil.move("./pics/" + files[key],"./pics/img" + str(key) + ".jpeg")

그렇게해야합니다. 파이썬 3 이상


... 또는 enumerate (files)의 키, fname ::
Nicolas D
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.