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.
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
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))
, 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:])
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_"))
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_', ''))
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.
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
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.
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)
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
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 ()
Qu'à ce sujet :
import re
p = re.compile(r'_')
p.split(filename, 1) #where filename is CHEESE_CHEESE_TYPE.***
ç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')