Ответы:
Используйте os.rename
:
import os
os.rename('a.txt', 'b.kml')
C:/folder/file.txt
в Windows или /home/file.txt
в Linux / MacOS).
OSError
в системах Windows. os.path.exists
должен использоваться, чтобы проверить, существует ли цель перед переименованием. Это создает ошибку «Время проверки - время использования», но вряд ли это вызовет проблемы. (Я не знаю простого способа обойти это - см. Здесь .
os.replace
Файл может находиться внутри каталога, в этом случае укажите путь:
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')
Это будет работать, чтобы переименовать или переместить файл.
shutil.move
не является хорошим вариантом из-за того, что не является атомарной операцией. Например, если файл открыт, shutil.move
он создаст файл new_name
, но не удалит его, old_name
поэтому у вас останется два файла. os.rename
с другой стороны, ничего не поделаешь, что является лучшим вариантом . При этом shutil.move
, даже если вы поймете ошибку, вам все равно придется беспокоиться о проверке и удалении мошеннического файла. Просто не стоит, когда существует лучший инструментos.rename
.
Начиная с Python 3.4 для решения этой проблемы можно использовать модуль pathlib .
Если вы используете более старую версию, вы можете использовать версию с бэкпортом, найденную здесь
Давайте предположим, что вы не находитесь в корневом пути (просто чтобы добавить к нему немного сложности), вы хотите переименовать и должны предоставить полный путь, мы можем посмотреть на это:
some_path = 'a/b/c/the_file.extension'
Итак, вы можете взять свой путь и создать из него Path
объект:
from pathlib import Path
p = Path(some_path)
Просто для того, чтобы предоставить некоторую информацию об этом объекте, который у нас есть сейчас, мы можем извлечь из него вещи. Например, если по какой-либо причине мы хотим переименовать файл, изменив имя файла с the_file
на на the_file_1
, то мы можем получить часть имени файла:
name_without_extension = p.stem
И еще держите удлинитель в руке:
ext = p.suffix
Мы можем выполнить нашу модификацию с помощью простой обработки строк:
Python 3.6 и выше используют f-строки!
new_file_name = f"{name_without_extension}_1"
В противном случае:
new_file_name = "{}_{}".format(name_without_extension, 1)
И теперь мы можем выполнить наше переименование, вызвав rename
метод для объекта пути, который мы создали, и добавив его, ext
чтобы завершить правильную структуру переименования, которую мы хотим:
p.rename(Path(p.parent, new_file_name + ext))
Короче, чтобы продемонстрировать его простоту:
Python 3.6+:
from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, f"{p.stem}_1_{p.suffix}"))
Версии ниже Python 3.6 используют метод строкового формата:
from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, "{}_{}_{}".format(p.stem, 1, p.suffix))
pathlib
библиотека представлена в Python 3.4, поэтому разделение ответа здесь также предоставляет возможность для твердого модуля продемонстрировать его универсальность и использование для более сложных требований.
{}
для форматирования строк, о котором вы можете прочитать здесь . В конечном итоге происходит {}
замена get на переменные, которые передаются format
методу. Таким образом, первый {}
будет содержать то, что находится внутри name_without_extension
, а второй будет содержать второй аргумент, который просто 1
.
os.rename(old, new)
Это можно найти в документации по Python: http://docs.python.org/library/os.html.
Использование os.rename
. Но вы должны передать полный путь обоих файлов к функции. Если у меня есть файл a.txt
на рабочем столе, так что я буду делать, а также я должен дать полный переименованный файл тоже.
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()
к каталогу, например, что происходит под Windows, когда это UNC? И делать это chdir()
имеет побочные эффекты. Я бы предпочел просто указать необходимые пути os.rename()
напрямую, но не chdir()
.
Вы можете использовать os.system для вызова терминала для выполнения задачи:
os.system('mv oldfile newfile')
mv
и встроенная в Unix программа командной строки для перемещения / переименования файла.
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
с современным pathlib
довольно сомнительным. Пройдите весь путь pathlib
вместо этого.
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")
Это должно сделать это. питон 3+