files - python rinominare file




Rinominare più file in una directory in Python (10)

Questa domanda ha già una risposta qui:

Sto cercando di rinominare alcuni file in una directory usando Python.

Diciamo che ho un file chiamato CHEESE_CHEESE_TYPE.*** e voglio rimuovere CHEESE_ così il mio nome file risultante sarebbe CHEESE_TYPE

Sto cercando di utilizzare os.path.split ma non funziona correttamente. Ho anche considerato l'utilizzo di manipolazioni di stringhe, ma non ho avuto successo neanche con questo.


Che dire di questo :

import re
p = re.compile(r'_')
p.split(filename, 1) #where filename is CHEESE_CHEESE_TYPE.***

È possibile utilizzare la funzione os.system per semplicità e invocare bash per eseguire l'attività:

import os
os.system('mv old_filename new_filename')

Ecco uno script basato sul tuo ultimo commento.

#!/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))

Ho lo stesso problema, dove voglio sostituire lo spazio bianco in qualsiasi file pdf in un trattino - . Ma i file erano in più sottodirectory. Quindi, ho dovuto usare os.walk() . Nel tuo caso per più sottodirectory, potrebbe essere qualcosa del genere:

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_', ''))

Inizialmente, stavo cercando una GUI che permettesse di rinominare usando le espressioni regolari e che avesse un'anteprima del risultato prima di applicare le modifiche.

Su Linux ho usato krename con successo, su Windows Total Commander si rinomina con krename , ma non ho trovato nessun equivalente decente per OSX, quindi ho finito per scrivere uno script python che funziona in modo ricorsivo e per impostazione predefinita stampa solo i nuovi nomi di file senza fare alcun i cambiamenti. Aggiungi l'opzione "-w" per modificare effettivamente i nomi dei file.

#!/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)

Esempio di utilizzo

Voglio capovolgere le parti di un nome di file nel modo seguente, ovvero spostare il bit m7-08 all'inizio del nome del file:

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

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

Questo eseguirà una corsa a vuoto e stamperà i nuovi nomi di file senza rinominare effettivamente alcun file:

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

Questo farà la ridenominazione attuale (puoi usare sia -w o --write ):

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

Prova questo:

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)

Suppongo che tu non voglia rimuovere l'estensione del file, ma puoi semplicemente eseguire lo stesso split con i periodi.


Questo funziona per me.

import os
for afile in os.listdir('.'):
    filename, file_extension = os.path.splitext(afile)
    if not file_extension == '.xyz':
        os.rename(afile, filename + '.abc')

Questo genere di cose è perfettamente adattato per IPython, che ha l'integrazione della shell.

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

Nota: per archiviare questo in uno script, utilizzare l'estensione .ipy e prefisso tutti i comandi della shell con ! .

Vedi anche: http://ipython.org/ipython-doc/stable/interactive/shell.html


Supponendo che tu sia già nella directory e che i "primi 8 caratteri" del tuo commento siano sempre veri. (Anche se "CHEESE_" è composto da 7 caratteri ...? Se è così, cambia l'8 in basso a 7)

from glob import glob
from os import rename
for fname in glob('*.prj'):
    rename(fname, fname[8:])

Usa os.rename(src, dst) per rinominare o spostare un file o una directory.

$ 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






file-rename