Odpowiedzi:
Użyj os.rename:
import os
os.rename('a.txt', 'b.kml')
C:/folder/file.txtw Windows lub /home/file.txtLinux / MacOS).
OSErrorw systemach Windows. os.path.existsnależ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.movenie jest dobrą opcją, ponieważ nie jest operacją atomową. Jeśli plik jest otwarty, na przykład shutil.moveutworzy plik new_name, ale nie usunie go, old_namepozostawiając dwa pliki. os.renamez 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ć Pathz 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_filena 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 renamemetodę na utworzonym obiekcie ścieżki i dołączając ją, extaby 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))
pathlibbiblioteka 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 formatmetody. 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.txtna 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')
mvwbudowany 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.pathz nowoczesnością pathlibjest dość niepewne. pathlibZamiast 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+