Come rinominare un file usando Python


Risposte:


578

Utilizzare os.rename:

import os

os.rename('a.txt', 'b.kml')

52
Va notato che se i file non si trovano nella directory di lavoro, sarà necessario il percorso completo.
EndermanAPM

non proprio, su 3.7 Ubuntu, funziona per me usando percorsi relativi
toing_toing

2
@toing_toing ovviamente funziona, probabilmente significa solo che dovresti essere a conoscenza della directory corrente e specificare il percorso relativo o semplicemente usare il percorso assoluto (come C:/folder/file.txtsu Windows o /home/file.txtsu Linux / MacOS).
Alex P.

Vale la pena notare che questo sovrascriverà silenziosamente i file su sistemi simili a Unix ma fallirà OSErrorsui sistemi Windows. os.path.existsdovrebbe essere usato per verificare se la destinazione esiste prima di rinominare. Questo crea un bug "Time Of Check to Time Of Use", ma è improbabile che causi problemi. (Non conosco un modo semplice per aggirare questo problema - vedi qui .
AnnanFay,

2
Se l'utente vuole davvero che il file venga sostituito su qualsiasi sistema operativo, si dovrebbe usareos.replace
LucG

74

Il file potrebbe trovarsi all'interno di una directory, in tal caso specificare il percorso:

import os
old_file = os.path.join("directory", "a.txt")
new_file = os.path.join("directory", "b.kml")
os.rename(old_file, new_file)

50
import shutil

shutil.move('a.txt', 'b.kml')

Questo funzionerà per rinominare o spostare un file.


32
shutil.movenon è una buona opzione perché non è un'operazione atomica. Se il file è aperto, ad esempio, shutil.movecreerà un file con new_name, ma non lo eliminerà old_namelasciando quindi due file. os.renamed'altra parte non farà nulla, che è un'opzione migliore . Con shutil.move, anche se hai riscontrato l'errore, dovresti comunque preoccuparti di controllare ed eliminare il file non autorizzato. Basta che non vale la pena quando esiste uno strumento migliore:os.rename .
mvbentes,

34

A partire da Python 3.4 è possibile utilizzare il modulo pathlib per risolvere questo problema.

Se ti capita di trovarti su una versione precedente, puoi utilizzare la versione di backport trovata qui

Supponiamo che tu non sia nel percorso di root (solo per aggiungere un po 'di difficoltà ad esso) che vuoi rinominare e devi fornire un percorso completo, possiamo guardare questo:

some_path = 'a/b/c/the_file.extension'

Quindi, puoi prendere il tuo percorso e crearne un Pathoggetto:

from pathlib import Path
p = Path(some_path)

Solo per fornire alcune informazioni su questo oggetto che abbiamo ora, possiamo estrarre cose da esso. Ad esempio, se per qualsiasi motivo vogliamo rinominare il file modificando il nome file da the_filea the_file_1, allora possiamo ottenere la parte nome file:

name_without_extension = p.stem

E tieni sempre presente anche l'estensione:

ext = p.suffix

Possiamo eseguire la nostra modifica con una semplice manipolazione di stringhe:

Python 3.6 e versioni successive utilizzano le stringhe f!

new_file_name = f"{name_without_extension}_1"

Altrimenti:

new_file_name = "{}_{}".format(name_without_extension, 1)

E ora possiamo eseguire la nostra ridenominazione chiamando il renamemetodo sull'oggetto path che abbiamo creato e aggiungendolo extper completare la struttura di ridenominazione corretta che vogliamo:

p.rename(Path(p.parent, new_file_name + ext))

Più presto per mostrare la sua semplicità:

Python 3.6+:

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, f"{p.stem}_1_{p.suffix}"))

Le versioni inferiori a Python 3.6 utilizzano invece il metodo del formato stringa:

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, "{}_{}_{}".format(p.stem, 1, p.suffix))

3
Perché dovresti fare questo invece della risposta accettata? Sembra molto più complicato
rbennell,

19
Bene @rbennell, la maggior parte di questa risposta è una spiegazione. La risposta è davvero solo le tre righe alla fine. Inoltre, la risposta accettata viene fatta esplicitamente per la stessa modifica del nome. Questa risposta fornisce un modo per mostrare come è possibile manipolare il nome file per preservare le parti desiderate nel percorso o nel nome del file. Inoltre, la pathliblibreria è stata introdotta in Python 3.4, quindi condividere la risposta qui fornisce anche l'esposizione a un modulo solido per mostrare la sua versatilità e utilizzo per requisiti più complessi.
idjaw,

4
Grazie @idjaw, il tuo commento è una buona risposta a una domanda di base di noi principianti, un semplice Perché l'hai fatto? . Inoltre, è interessante vedere un approccio non ostile su Internet a ciò che viene spesso considerato ignorante.
Igor V.

3
@SasukeUchiha - {}Sono per la formattazione delle stringhe, di cui puoi leggere qui . Alla fine, ciò che sta accadendo è che {}vengono sostituiti con le variabili che vengono passate al formatmetodo. Quindi il primo {}conterrà ciò che è dentro name_without_extension, e il secondo conterrà il secondo argomento che è semplicemente 1.
idjaw

3
L'uso di f-string semplifica ancora di più. da pathlib import Path p = Path (some_path) version = 1 p.rename (Path (p.parent, f "{p.stem} _ {version}" + p.suffix))
Liquidgenius


8

Usa os.rename. Ma devi passare il percorso completo di entrambi i file alla funzione. Se ho un file a.txtsul mio desktop, lo farò e dovrò dare anche il file completo.

 os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')

1
"Devo" non è vero. È sempre possibile sostituire un nome file relativo con un nome file assoluto e viceversa. Ciò che di solito morde i principianti è che non capiscono come i nomi dei file relativi si collegano alla directory di lavoro corrente.
triplo

3
import os

# Set the path
path = 'a\\b\\c'  
# save current working directory
saved_cwd = os.getcwd()
# change your cwd to the directory which contains files
os.chdir(path)
os.rename('a.txt', 'b.klm')
# moving back to the directory you were in 
os.chdir(saved_cwd)

1
Diffidare di farlo in questo modo. Non è sempre possibile accedere chdir()a una directory, ad esempio cosa succede in Windows quando è un UNC? E fare un chdir()ha effetti collaterali. Preferirei semplicemente specificare i percorsi necessari os.rename()direttamente, senza chdir()ing.
JonBrave,

0

È possibile utilizzare os.system per richiamare il terminale per eseguire l'attività:

os.system('mv oldfile newfile')

sì, funzionerà solo su una macchina basata su unix come mvè un programma a riga di comando incorporato unix per spostare / rinominare un file.
Mikhail Geyer,

9
Perché dovresti invocare un terminale e definire un comando UNIX solo quando puoi farlo da Python in modo multipiattaforma?
EndermanAPM

0
import os
import re
from pathlib import Path

for f in os.listdir(training_data_dir2):
  for file in os.listdir( training_data_dir2 + '/' + f):
    oldfile= Path(training_data_dir2 + '/' + f + '/' + file)
    newfile = Path(training_data_dir2 + '/' + f + '/' + file[49:])
    p=oldfile
    p.rename(newfile)

1
La barra in avanti con codifica rigida come separatore di percorso e mescolare il vecchio stile os.pathcon il moderno pathlibè piuttosto incerta. Vai fino in fondo con pathlibinvece.
triplo

0
import shutil
import os

files = os.listdir("./pics/") 

for key in range(0, len(files)):
   print files[key]
   shutil.move("./pics/" + files[key],"./pics/img" + str(key) + ".jpeg")

Questo dovrebbe farlo. python 3+


... o usa enumerate per una versione leggermente più leggibile: per key, fname in enumerate (files):…
Nicolas D
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.