Risposte:
Utilizzare os.rename
:
import os
os.rename('a.txt', 'b.kml')
C:/folder/file.txt
su Windows o /home/file.txt
su Linux / MacOS).
OSError
sui sistemi Windows. os.path.exists
dovrebbe 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 .
os.replace
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)
import shutil
shutil.move('a.txt', 'b.kml')
Questo funzionerà per rinominare o spostare un file.
shutil.move
non è una buona opzione perché non è un'operazione atomica. Se il file è aperto, ad esempio, shutil.move
creerà un file con new_name
, ma non lo eliminerà old_name
lasciando quindi due file. os.rename
d'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
.
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 Path
oggetto:
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_file
a 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 rename
metodo sull'oggetto path che abbiamo creato e aggiungendolo ext
per 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))
pathlib
libreria è 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.
{}
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 format
metodo. Quindi il primo {}
conterrà ciò che è dentro name_without_extension
, e il secondo conterrà il secondo argomento che è semplicemente 1
.
os.rename(old, new)
Questo si trova nei documenti di Python: http://docs.python.org/library/os.html
Usa os.rename
. Ma devi passare il percorso completo di entrambi i file alla funzione. Se ho un file a.txt
sul mio desktop, lo farò e dovrò dare anche il file completo.
os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')
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)
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.
È possibile utilizzare os.system per richiamare il terminale per eseguire l'attività:
os.system('mv oldfile newfile')
mv
è un programma a riga di comando incorporato unix per spostare / rinominare un file.
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)
os.path
con il moderno pathlib
è piuttosto incerta. Vai fino in fondo con pathlib
invece.
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+