Odpowiedzi:
Użyj os.rename
:
import os
os.rename('a.txt', 'b.kml')
C:/folder/file.txt
w Windows lub /home/file.txt
Linux / MacOS).
OSError
w systemach Windows. os.path.exists
należy użyć do sprawdzenia, czy cel istnieje przed zmianą nazwy. Powoduje to powstanie błędu „Czas sprawdzenia do czasu użycia”, ale jest mało prawdopodobne, aby powodował problemy. (Nie znam łatwego sposobu na obejście tego - patrz tutaj .
os.replace
Plik może znajdować się w katalogu, w takim przypadku określ ścieżkę:
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')
Działa to w celu zmiany nazwy lub przeniesienia pliku.
shutil.move
nie jest dobrą opcją, ponieważ nie jest operacją atomową. Jeśli plik jest otwarty, na przykład shutil.move
utworzy plik new_name
, ale nie usunie go, old_name
pozostawiając dwa pliki. os.rename
z drugiej strony nic nie zrobi, co jest lepszą opcją . Dzięki shutil.move
, nawet jeśli złapiesz błąd, nadal będziesz musiał się martwić o sprawdzenie i usunięcie nieuczciwego pliku. Po prostu nie warto, kiedy istnieje lepsze narzędzie:os.rename
.
Od wersji Python 3.4 można to rozwiązać za pomocą modułu pathlib .
Jeśli akurat używasz starszej wersji, możesz skorzystać z wersji z backportowaną wersją, którą znajdziesz tutaj
Załóżmy, że nie znajdujesz się w ścieżce katalogu głównego (aby dodać trochę trudności), której nazwę chcesz zmienić, i musisz podać pełną ścieżkę, możemy na to spojrzeć:
some_path = 'a/b/c/the_file.extension'
Możesz więc obrać ścieżkę i utworzyć Path
z niej obiekt:
from pathlib import Path
p = Path(some_path)
Aby dostarczyć trochę informacji o tym obiekcie, który mamy teraz, możemy z niego wyciągnąć różne rzeczy. Na przykład, jeśli z jakiegokolwiek powodu chcemy zmienić nazwę pliku, zmieniając nazwę pliku z the_file
na the_file_1
, możemy uzyskać część nazwy pliku:
name_without_extension = p.stem
I nadal trzymaj przedłużenie w ręku:
ext = p.suffix
Możemy wykonać naszą modyfikację za pomocą prostej manipulacji ciągiem:
Python 3.6 i nowsze wersje używają f-stringów!
new_file_name = f"{name_without_extension}_1"
Inaczej:
new_file_name = "{}_{}".format(name_without_extension, 1)
A teraz możemy wykonać naszą zmianę nazwy, wywołując rename
metodę na utworzonym obiekcie ścieżki i dołączając ją, ext
aby ukończyć odpowiednią strukturę zmiany nazwy:
p.rename(Path(p.parent, new_file_name + ext))
Krótko mówiąc, aby pokazać jego prostotę:
Python 3.6+:
from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, f"{p.stem}_1_{p.suffix}"))
Wersje mniejsze niż Python 3.6 używają zamiast tego metody formatu ciągu:
from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, "{}_{}_{}".format(p.stem, 1, p.suffix))
pathlib
biblioteka została wprowadzona w Pythonie 3.4, więc dzielenie się odpowiedzią tutaj zapewnia również ekspozycję solidnego modułu, aby pokazać jego wszechstronność i wykorzystanie dla bardziej skomplikowanych wymagań.
{}
służą do formatowania ciągów, o których można przeczytać tutaj . Ostatecznie dzieje się tak, że {}
get jest zastępowany zmiennymi przekazywanymi do format
metody. Tak więc pierwszy {}
będzie zawierał to, co jest w środku name_without_extension
, a drugi zawiera drugi argument, który jest po prostu 1
.
os.rename(old, new)
Można to znaleźć w dokumentach Pythona: http://docs.python.org/library/os.html
Zastosowanie os.rename
. Ale musisz przekazać pełną ścieżkę obu plików do funkcji. Jeśli mam plik a.txt
na pulpicie, zrobię to i muszę też podać pełny plik o zmienionej nazwie.
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()
przejść do katalogu, np. Co dzieje się w systemie Windows, gdy jest to UNC? I robienie chdir()
ma skutki uboczne. Wolę po prostu określić niezbędne ścieżki do os.rename()
bezpośredniego, bez chdir()
ing.
Możesz użyć os.system, aby wywołać terminal w celu wykonania zadania:
os.system('mv oldfile newfile')
mv
wbudowany program wiersza polecenia unix do przenoszenia / zmiany nazwy pliku.
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
z nowoczesnością pathlib
jest dość niepewne. pathlib
Zamiast tego idź na całość .
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")
To powinno to zrobić. python 3+