Wsadowa zmiana nazwy plików w katalogu

Czy istnieje łatwy sposób na zmianę nazwy grupy plików już zawartych w katalogu, używając Pythona?

Przykład: mam katalog pełen *.pliki doc i chcę je zmienić w spójny sposób.

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

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

Author: xsl, 2008-10-22

11 answers

Taka zmiana nazwy jest dość łatwa, na przykład z modułami os i glob :

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

Możesz użyć go w swoim przykładzie w następujący sposób:

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

Powyższy przykład przekonwertuje wszystkie pliki {[2] } w katalogu c:\temp\xx na new(%s).doc, Gdzie %s jest poprzednią nazwą bazową pliku (bez rozszerzenia).

 94
Author: DzinX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 18:59:57

Wolę pisać małe linijki dla każdego zastąpienia, które muszę zrobić, zamiast tworzyć bardziej ogólny i złożony kod. Np.:

Zastępuje wszystkie podkreślniki myślnikami w dowolnym Nie ukrytym pliku w bieżącym katalogu

import os
[os.rename(f, f.replace('_', '-')) for f in os.listdir('.') if not f.startswith('.')]
 107
Author: Cesar Canassa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-27 14:53:14

Jeśli nie masz nic przeciwko używaniu wyrażeń regularnych, ta funkcja dałaby Ci wiele mocy w zmienianiu nazw plików:

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

Więc w twoim przykładzie możesz zrobić (zakładając, że jest to bieżący katalog, w którym znajdują się pliki):

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

Ale możesz też wrócić do początkowych nazw plików:

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

I więcej.

 21
Author: tzot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 19:30:05

Mam to po prostu zmienić nazwę wszystkich plików w podfolderach folderu

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

Zamieniam wszystkie wystąpienia old_str na any case przez new_str.

 10
Author: octoback,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-04 09:46:49

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

Lubię mieć swoją muzykę, film i Pliki Obrazów nazwane w określony sposób. Gdy pobieram pliki z internet, zwykle nie podążają za moim konwencja nazewnictwa. I found myself ręcznie zmieniając nazwę KAŻDEGO pliku, aby pasował do mojego styl. To się szybko starzeje, więc ... postanowiłem napisać program do tego dla mnie.

Ten program potrafi przekonwertować nazwę pliku do wszystkich małych liter, zastąp struny w nazwa pliku z czym chcesz, i przyciąć dowolną ilość znaków z przód lub tył nazwy pliku.

Dostępny jest również kod źródłowy programu.

 6
Author: xsl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 13:37:36

Napisałem skrypt Pythona na własną rękę. Przyjmuje jako argumenty ścieżkę katalogu, w którym znajdują się pliki oraz wzorzec nazewnictwa, którego chcesz użyć. Jednak zmienia nazwy, dołączając liczbę przyrostową (1, 2, 3 itd.) do podanego wzorca nazewnictwa.

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
Mam nadzieję, że to zadziała.
 6
Author: harisibrahimkv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-15 05:56:20
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 
 1
Author: frank__aguirre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-30 08:52:01

Miałem podobny problem, ale chciałem dodać tekst do początku nazwy pliku wszystkich plików w katalogu i zastosowałem podobną metodę. Zobacz przykład poniżej:

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
Author: Amber Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-25 06:22:55
#  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
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-02 15:57:25

Jak dla mnie w moim katalogu mam wiele subdir, każdy subdir ma wiele obrazów chcę zmienić wszystkie obrazy subdir na 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

(mys own answer) https://stackoverflow.com/a/45734381/6329006

 0
Author: Jayhello,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-17 11:59:31

Bądź w katalogu, w którym musisz dokonać zmiany nazwy.

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
 0
Author: Ajay Chandran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-03 21:43:41