Renommer plusieurs fichiers dans un répertoire en Python [dupliquer]

cette question a déjà une réponse ici:

  • comment renommer un fichier en utilisant Python 10 réponses
  • renommer plusieurs fichiers en Python 2 réponses

j'essaie de renommer certains fichiers dans un répertoire en utilisant Python.

dites que j'ai un fichier appelé CHEESE_CHEESE_TYPE.*** et que je veux supprimer CHEESE_ pour que mon nom de fichier résultant soit CHEESE_TYPE

j'essaie d'utiliser le os.path.split mais il ne fonctionne pas correctement. J'ai également envisagé d'utiliser des manipulations de cordes, mais je n'ai pas réussi non plus.

374
demandé sur poke 2010-05-03 19:17:38

15 réponses

Utiliser os.rename(src, dst) pour renommer ou déplacer un fichier ou un répertoire.

$ ls
cheese_cheese_type.bar  cheese_cheese_type.foo
$ python
>>> import os
>>> for filename in os.listdir("."):
...  if filename.startswith("cheese_"):
...    os.rename(filename, filename[7:])
... 
>>> 
$ ls
cheese_type.bar  cheese_type.foo
596
répondu Messa 2017-01-20 22:07:01

voici un script basé sur votre dernier commentaire.

#!/usr/bin/env python
from os import rename, listdir

badprefix = "cheese_"
fnames = listdir('.')

for fname in fnames:
    if fname.startswith(badprefix*2):
        rename(fname, fname.replace(badprefix, '', 1))
34
répondu bukzor 2010-05-03 15:43:08

, en Supposant que vous êtes déjà dans le répertoire, et que les 8 premiers caractères de votre commentaire vrai toujours. (Bien que "CHEESE_" soit de 7 caractères... ? Dans l'affirmative, modifier le 8 ci-dessous en 7)

from glob import glob
from os import rename
for fname in glob('*.prj'):
    rename(fname, fname[8:])
14
répondu darelf 2010-05-03 15:54:11

le code suivant devrait fonctionner. Il prend chaque nom de fichier dans le répertoire courant, si le nom de fichier contient le motif CHEESE_CHEESE_ alors il est renommé. Si non rien n'est fait pour le nom de fichier.

import os
for fileName in os.listdir("."):
    os.rename(fileName, fileName.replace("CHEESE_CHEESE_", "CHEESE_"))
13
répondu Yogeesh Seralathan 2015-12-11 23:28:36

j'ai le même problème, où je veux remplacer l'espace blanc in any pdf file to a dash - . Mais les fichiers étaient dans plusieurs sous-répertoires. Donc, j'ai dû utiliser os.walk() . Dans votre cas pour plusieurs sous-répertoires, il pourrait être quelque chose comme ceci:

import os
for dpath, dnames, fnames in os.walk('/path/to/directory'):
    for f in fnames:
        os.chdir(dpath)
        if f.startswith('cheese_'):
            os.rename(f, f.replace('cheese_', ''))
8
répondu Aziz Alto 2015-03-08 21:15:08

essayez ceci:

import os
import shutil

for file in os.listdir(dirpath):
    newfile = os.path.join(dirpath, file.split("_",1)[1])
    shutil.move(os.path.join(dirpath,file),newfile)

je suppose que vous ne voulez pas supprimer l'extension du fichier, mais vous pouvez simplement faire la même scission avec periods.

6
répondu krs1 2013-05-16 12:03:43

ce genre de choses est parfaitement adapté pour IPython, qui a l'intégration shell.

In [1] files = !ls
In [2] for f in files:
           newname = process_filename(f)
           mv $f $newname

Note: pour stocker cela dans un script, utilisez l'extension .ipy , et préfixez toutes les commandes shell avec ! .

Voir aussi: http://ipython.org/ipython-doc/stable/interactive/shell.html

5
répondu Erik Allik 2014-03-24 18:08:21

il semble que votre problème soit plus de déterminer le nouveau nom de fichier que le nom lui-même (pour lequel vous pouvez utiliser le système d'exploitation).renommer la méthode).

il n'est pas clair de votre question ce que le modèle est que vous voulez être renommer. Il n'y a rien de mal avec la manipulation de la chaîne. Une expression régulière peut être ce dont vous avez besoin ici.

2
répondu Uri 2010-05-03 15:23:15

Voici une solution plus générale:

ce code peut être utilisé pour supprimer récursivement un caractère particulier ou un ensemble de caractères de tous les noms de fichiers d'un répertoire et les remplacer par tout autre caractère, ensemble de caractères ou aucun caractère.

import os

paths = (os.path.join(root, filename)
        for root, _, filenames in os.walk('C:\FolderName')
        for filename in filenames)

for path in paths:
    # the '#' in the example below will be replaced by the '-' in the filenames in the directory
    newname = path.replace('#', '-')
    if newname != path:
        os.rename(path, newname)
2
répondu nicholas 2014-07-25 11:01:23

cette commande supprimera la chaîne initiale "CHEESE_" de tous les fichiers du répertoire courant, en utilisant renamer :

$ renamer --find "/^CHEESE_/" *
2
répondu Lloyd 2018-07-18 09:39:47

vous pouvez utiliser os.fonction de système pour la simplicité et d'invoquer bash pour accomplir la tâche:

import os
os.system('mv old_filename new_filename')
1
répondu 2016-01-11 05:06:24

je cherchais à l'origine une interface graphique qui permettrait de renommer en utilisant des expressions régulières et qui aurait un aperçu du résultat avant d'appliquer des modifications.

sous Linux j'ai utilisé avec succès krename , sous Windows Total Commander rename avec regexes, mais je n'ai pas trouvé d'équivalent libre décent pour OSX, donc j'ai fini par écrire un script python qui fonctionne de manière récursive et par défaut n'imprime que les nouveaux noms de fichiers sans faire aucune changement. Ajouter le commutateur'- w ' pour modifier réellement les noms de fichiers.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import fnmatch
import sys
import shutil
import re


def usage():
    print """
Usage:
        %s <work_dir> <search_regex> <replace_regex> [-w|--write]

        By default no changes are made, add '-w' or '--write' as last arg to actually rename files
        after you have previewed the result.
        """ % (os.path.basename(sys.argv[0]))


def rename_files(directory, search_pattern, replace_pattern, write_changes=False):

    pattern_old = re.compile(search_pattern)

    for path, dirs, files in os.walk(os.path.abspath(directory)):

        for filename in fnmatch.filter(files, "*.*"):

            if pattern_old.findall(filename):
                new_name = pattern_old.sub(replace_pattern, filename)

                filepath_old = os.path.join(path, filename)
                filepath_new = os.path.join(path, new_name)

                if not filepath_new:
                    print 'Replacement regex {} returns empty value! Skipping'.format(replace_pattern)
                    continue

                print new_name

                if write_changes:
                    shutil.move(filepath_old, filepath_new)
            else:
                print 'Name [{}] does not match search regex [{}]'.format(filename, search_pattern)

if __name__ == '__main__':
    if len(sys.argv) < 4:
        usage()
        sys.exit(-1)

    work_dir = sys.argv[1]
    search_regex = sys.argv[2]
    replace_regex = sys.argv[3]
    write_changes = (len(sys.argv) > 4) and sys.argv[4].lower() in ['--write', '-w']
    rename_files(work_dir, search_regex, replace_regex, write_changes)

exemple de cas d'utilisation

je veux retourner des parties d'un nom de fichier de la manière suivante, i.e. déplacer le bit m7-08 au début du nom de fichier:

# Before:
Summary-building-mobile-apps-ionic-framework-angularjs-m7-08.mp4

# After:
m7-08_Summary-building-mobile-apps-ionic-framework-angularjs.mp4

cela va effectuer un dry run, et imprimer les nouveaux noms de fichiers sans réellement renommer les fichiers:

rename_files_regex.py . "([^\.]+?)-(m\d+-\d+)" "\2_\1"

cela fera le réel renommage (vous peut utiliser soit -w ou --write ):

rename_files_regex.py . "([^\.]+?)-(m\d+-\d+)" "\2_\1" --write
1
répondu ccpizza 2016-04-16 19:37:49

importer os l'importation de la chaîne Def rename_files ():

#List all files in the directory
file_list = os.listdir("/Users/tedfuller/Desktop/prank/")
print(file_list)

#Change current working directory and print out it's location
working_location = os.chdir("/Users/tedfuller/Desktop/prank/")
working_location = os.getcwd()
print(working_location)

#Rename all the files in that directory
for file_name in file_list:
    os.rename(file_name, file_name.translate(str.maketrans("","",string.digits)))

rename_files ()

1
répondu Ted Fuller 2016-08-04 19:04:10

Qu'à ce sujet :

import re
p = re.compile(r'_')
p.split(filename, 1) #where filename is CHEESE_CHEESE_TYPE.***
0
répondu Bandan 2010-05-03 15:34:11

ça me va.

import os
for afile in os.listdir('.'):
    filename, file_extension = os.path.splitext(afile)
    if not file_extension == '.xyz':
        os.rename(afile, filename + '.abc')
0
répondu edib 2017-04-16 20:43:41