디렉토리에있는 파일의 일괄 이름 바꾸기


102

Python을 사용하여 디렉토리에 이미 포함 된 파일 그룹의 이름을 쉽게 바꿀 수있는 방법이 있습니까?

예 : * .doc 파일로 가득 찬 디렉토리가 있고 일관된 방식으로 이름을 바꾸고 싶습니다.

X.doc-> "new (X) .doc"

Y.doc-> "new (Y) .doc"

답변:


114

이러한 이름 변경은 예를 들어 osglob 모듈 과 같이 매우 쉽습니다 .

import glob, os

def rename(dir, pattern, titlePattern):
    for pathAndFilename in glob.iglob(os.path.join(dir, pattern)):
        title, ext = os.path.splitext(os.path.basename(pathAndFilename))
        os.rename(pathAndFilename, 
                  os.path.join(dir, titlePattern % title + ext))

그런 다음 다음과 같이 예제에서 사용할 수 있습니다.

rename(r'c:\temp\xx', r'*.doc', r'new(%s)')

위의 예는 dir의 모든 *.doc파일을 로 변환합니다 . 여기서는 파일 의 이전 기본 이름 (확장자 없음)입니다.c:\temp\xxnew(%s).doc%s


1
%명령에서 기호 는 어떻게 사용 os.path.join(dir, titlePattern % title + ext)됩니까? 나는 %모듈로 연산을위한 것이며 포맷팅 연산자로도 사용된다는 것을 알고 있습니다. 그러나 일반적으로 형식을 지정하기 위해 s또는 뒤에옵니다 f. %말한 명령 바로 뒤에 아무것도 (공백)없는 이유는 무엇 입니까?
Shashank Sawant 2014

3
@ShashankSawant 실제로 형식화 연산자입니다. 문서 및 샘플 사용법 은 문자열 형식화 작업 을 참조하십시오 .
DzinX 2014

133

더 일반적이고 복잡한 코드를 만드는 대신해야 할 각 교체에 대해 하나의 작은 라이너를 작성하는 것을 선호합니다. 예 :

이렇게하면 현재 디렉터리에있는 숨겨지지 않은 파일의 모든 밑줄이 하이픈으로 바뀝니다.

import os
[os.rename(f, f.replace('_', '-')) for f in os.listdir('.') if not f.startswith('.')]

4
다른 방법보다 훨씬 쉽습니다. 이것이 제가 파이썬을 사랑하는 이유입니다.
Dan Gayle

오늘 내 "이름 바꾸기"명령이 작동하지 않는 이유를 알아 내느라 너무 많은 시간을 낭비했습니다. 먼저 여기에 왔어 야 했어요! 위대한 Pythonic 한 줄짜리!
Devin

Windows가 각 파일 다음에 알파벳 순서로 파일을 계속 재정렬하기 때문에 작동하지 않습니다. rename:(
ytpillai

4
훌륭하지만 하위 디렉토리가없는 디렉토리에서만 작동합니다.
Hill

당신은 얻을 경우 no such file error단지 기억 os.rename의 전체 경로 필요
Windsooon

22

정규 표현식을 사용해도 괜찮다면이 함수는 파일 이름을 바꾸는 데 많은 힘을 줄 것입니다.

import re, glob, os

def renamer(files, pattern, replacement):
    for pathname in glob.glob(files):
        basename= os.path.basename(pathname)
        new_filename= re.sub(pattern, replacement, basename)
        if new_filename != basename:
            os.rename(
              pathname,
              os.path.join(os.path.dirname(pathname), new_filename))

따라서 귀하의 예에서 할 수 있습니다 (파일이있는 현재 디렉토리라고 가정).

renamer("*.doc", r"^(.*)\.doc$", r"new(\1).doc")

그러나 초기 파일 이름으로 롤백 할 수도 있습니다.

renamer("*.doc", r"^new\((.*)\)\.doc", r"\1.doc")

그리고 더.


11

폴더의 하위 폴더에있는 모든 파일의 이름을 간단히 변경하려면

import os

def replace(fpath, old_str, new_str):
    for path, subdirs, files in os.walk(fpath):
        for name in files:
            if(old_str.lower() in name.lower()):
                os.rename(os.path.join(path,name), os.path.join(path,
                                            name.lower().replace(old_str,new_str)))

old_str의 모든 발생을 new_str로 모든 경우로 대체하고 있습니다.


이 코드는 디렉토리에있는 파일 제목의 일부를 대체하는 데 실제로 사용됩니다.
geoJshaun

6

시도 : http://www.mattweber.org/2007/03/04/python-script-renamepy/

내 음악, 영화, 사진 파일 이름을 특정 방식으로 지정하는 것을 좋아합니다. 인터넷에서 파일을 다운로드 할 때 일반적으로 내 명명 규칙을 따르지 않습니다. 내 스타일에 맞게 각 파일의 이름을 수동으로 변경했습니다. 이건 정말 빨리 늙었 기 때문에 저를위한 프로그램을 작성하기로 결정했습니다.

이 프로그램은 파일 이름을 모두 소문자로 변환하고, 파일 이름의 문자열을 원하는대로 바꾸고, 파일 이름의 앞이나 뒤에서 원하는 수의 문자를자를 수 있습니다.

프로그램의 소스 코드도 사용할 수 있습니다.


1
불행히도 링크가 끊어졌습니다. 소스 코드가 어디에 있는지 아는 사람이 있습니까?
ryanpcmcquen 2016

6

저는 파이썬 스크립트를 직접 작성했습니다. 파일이있는 디렉토리의 경로와 사용할 이름 지정 패턴을 인수로 사용합니다. 그러나 사용자가 지정한 이름 지정 패턴에 증분 번호 (1, 2, 3 등)를 첨부하여 이름을 바꿉니다.

import os
import sys

# checking whether path and filename are given.
if len(sys.argv) != 3:
    print "Usage : python rename.py <path> <new_name.extension>"
    sys.exit()

# splitting name and extension.
name = sys.argv[2].split('.')
if len(name) < 2:
    name.append('')
else:
    name[1] = ".%s" %name[1]

# to name starting from 1 to number_of_files.
count = 1

# creating a new folder in which the renamed files will be stored.
s = "%s/pic_folder" % sys.argv[1]
try:
    os.mkdir(s)
except OSError:
    # if pic_folder is already present, use it.
    pass

try:
    for x in os.walk(sys.argv[1]):
        for y in x[2]:
            # creating the rename pattern.
            s = "%spic_folder/%s%s%s" %(x[0], name[0], count, name[1])
            # getting the original path of the file to be renamed.
            z = os.path.join(x[0],y)
            # renaming.
            os.rename(z, s)
            # incrementing the count.
            count = count + 1
except OSError:
    pass

이것이 당신을 위해 작동하기를 바랍니다.


5

이름 변경을 수행해야하는 디렉토리에 있어야합니다.

import os
# get the file name list to nameList
nameList = os.listdir() 
#loop through the name and rename
for fileName in nameList:
    rename=fileName[15:28]
    os.rename(fileName,rename)
#example:
#input fileName bulk like :20180707131932_IMG_4304.JPG
#output renamed bulk like :IMG_4304.JPG

하려면 ... "디렉토리에있을"사용os.chdir(path_of_directory)
MagTun

2
directoryName = "Photographs"
filePath = os.path.abspath(directoryName)
filePathWithSlash = filePath + "\\"

for counter, filename in enumerate(os.listdir(directoryName)):

    filenameWithPath = os.path.join(filePathWithSlash, filename)

    os.rename(filenameWithPath, filenameWithPath.replace(filename,"DSC_" + \
          str(counter).zfill(4) + ".jpg" ))

# e.g. filename = "photo1.jpg", directory = "c:\users\Photographs"        
# The string.replace call swaps in the new filename into 
# the current filename within the filenameWitPath string. Which    
# is then used by os.rename to rename the file in place, using the  
# current (unmodified) filenameWithPath.

# os.listdir delivers the filename(s) from the directory
# however in attempting to "rename" the file using os 
# a specific location of the file to be renamed is required.

# this code is from Windows 

2

비슷한 문제가 있었지만 디렉토리에있는 모든 파일의 파일 이름 시작 부분에 텍스트를 추가하고 비슷한 방법을 사용했습니다. 아래 예를 참조하십시오.

folder = r"R:\mystuff\GIS_Projects\Website\2017\PDF"

import os


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


for filename in filenames:  
    fullpath = os.path.join(root, filename)  
    filename_split = os.path.splitext(filename) # filename will be filename_split[0] and extension will be filename_split[1])
    print fullpath
    print filename_split[0]
    print filename_split[1]
    os.rename(os.path.join(root, filename), os.path.join(root, "NewText_2017_" + filename_split[0] + filename_split[1]))

1

내 디렉토리에는 여러 개의 하위 디렉토리가 있으며 각 하위 디렉토리에는 모든 하위 디렉토리 이미지를 1.jpg ~ n.jpg로 변경하고 싶습니다.

def batch_rename():
    base_dir = 'F:/ad_samples/test_samples/'
    sub_dir_list = glob.glob(base_dir + '*')
    # print sub_dir_list # like that ['F:/dir1', 'F:/dir2']
    for dir_item in sub_dir_list:
        files = glob.glob(dir_item + '/*.jpg')
        i = 0
        for f in files:
            os.rename(f, os.path.join(dir_item, str(i) + '.jpg'))
            i += 1

(내 자신의 대답) https://stackoverflow.com/a/45734381/6329006


1
#  another regex version
#  usage example:
#  replacing an underscore in the filename with today's date
#  rename_files('..\\output', '(.*)(_)(.*\.CSV)', '\g<1>_20180402_\g<3>')
def rename_files(path, pattern, replacement):
    for filename in os.listdir(path):
        if re.search(pattern, filename):
            new_filename = re.sub(pattern, replacement, filename)
            new_fullname = os.path.join(path, new_filename)
            old_fullname = os.path.join(path, filename)
            os.rename(old_fullname, new_fullname)
            print('Renamed: ' + old_fullname + ' to ' + new_fullname

1

편집기 (예 : vim)에서 파일 이름을 수정하려면 클릭 라이브러리 click.edit()에 편집기에서 사용자 입력을받는 데 사용할 수있는 명령이 함께 제공됩니다 . 다음은 디렉토리에서 파일을 리팩터링하는 데 사용할 수있는 방법의 예입니다.

import click
from pathlib import Path

# current directory
direc_to_refactor = Path(".")

# list of old file paths
old_paths = list(direc_to_refactor.iterdir())

# list of old file names
old_names = [str(p.name) for p in old_paths]

# modify old file names in an editor,
# and store them in a list of new file names
new_names = click.edit("\n".join(old_names)).split("\n")

# refactor the old file names
for i in range(len(old_paths)):
    old_paths[i].replace(direc_to_refactor / new_names[i])

동일한 기술을 사용하지만이 스크립트의 변동성을 줄이고 재귀 적 리팩토링과 같은 더 많은 옵션을 제공하는 명령 줄 응용 프로그램을 작성했습니다. 다음은 github 페이지에 대한 링크 입니다. 이것은 명령 줄 응용 프로그램을 좋아하고 파일 이름을 빠르게 편집하려는 경우에 유용합니다. (내 응용 프로그램에서 볼 수있는 "bulkrename"명령과 유사 레인저 ).


1
외부 리소스에 대한 링크를 권장하지만 링크가 만료 될 때 쓸모 없게되는 링크 전용 답변은 권장하지 않습니다. 질문에 대한 답변을 포함하도록 응답을 업데이트하십시오 :)
IT 연체

물론. 게시물을 수정하겠습니다. 이것이 나의 첫 번째 기여이므로 지침에 감사드립니다!
Jim Shaddix 19

0

이 코드는 작동합니다

이 함수는 정확히 두 개의 인수 f_patth를 파일 이름을 바꾸는 경로로, new_name을 파일의 새 이름으로 사용합니다.

import glob2
import os


def rename(f_path, new_name):
    filelist = glob2.glob(f_path + "*.ma")
    count = 0
    for file in filelist:
        print("File Count : ", count)
        filename = os.path.split(file)
        print(filename)
        new_filename = f_path + new_name + str(count + 1) + ".ma"
        os.rename(f_path+filename[1], new_filename)
        print(new_filename)
        count = count + 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.