Как переименовать файл с помощью Python

Ответы:

578

Используйте os.rename:

import os

os.rename('a.txt', 'b.kml')
ВЫ
источник
52
Следует отметить, что если файлы не находятся в рабочем каталоге, вам потребуется полный путь.
EndermanAPM
не совсем, на 3.7 Ubuntu, у меня работает с использованием относительных путей
toing_toing
2
@toing_toing, конечно, это работает, он, вероятно, просто означает, что вы должны знать о текущем каталоге и либо указать путь относительно него, либо просто использовать абсолютный путь (как C:/folder/file.txtв Windows или /home/file.txtв Linux / MacOS).
Алекс П.
Стоит отметить, что это автоматически перезаписывает файлы в Unix-подобных системах, но не работает OSErrorв системах Windows. os.path.existsдолжен использоваться, чтобы проверить, существует ли цель перед переименованием. Это создает ошибку «Время проверки - время использования», но вряд ли это вызовет проблемы. (Я не знаю простого способа обойти это - см. Здесь .
AnnanFay
2
Если пользователь действительно хочет заменить файл в любой операционной системе, следует использоватьos.replace
LucG
74

Файл может находиться внутри каталога, в этом случае укажите путь:

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')

Это будет работать, чтобы переименовать или переместить файл.

Энди Валаам
источник
32
shutil.moveне является хорошим вариантом из-за того, что не является атомарной операцией. Например, если файл открыт, shutil.moveон создаст файл new_name, но не удалит его, old_nameпоэтому у вас останется два файла. os.renameс другой стороны, ничего не поделаешь, что является лучшим вариантом . При этом shutil.move, даже если вы поймете ошибку, вам все равно придется беспокоиться о проверке и удалении мошеннического файла. Просто не стоит, когда существует лучший инструментos.rename .
mvbentes
34

Начиная с 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))
idjaw
источник
3
Почему вы делаете это вместо принятого ответа? Кажется, гораздо сложнее
rbennell
19
Хорошо @rbennell, большая часть этого ответа - объяснение. Ответ на самом деле только три строки в конце. Кроме того, принятый ответ сделан явно для этого самого изменения имени. Этот ответ предоставляет способ показать, как вы можете манипулировать именем файла, чтобы сохранить нужные вам части в пути или имени файла. Кроме того, pathlibбиблиотека представлена ​​в Python 3.4, поэтому разделение ответа здесь также предоставляет возможность для твердого модуля продемонстрировать его универсальность и использование для более сложных требований.
idjaw
4
Спасибо @idjaw, ваш комментарий - хороший ответ на основной вопрос нас, начинающих, простой. Почему вы это сделали? , Кроме того, приятно видеть в Интернете не враждебный подход к тому, что часто считают невежественным.
Игорь В.
3
@SasukeUchiha - {}для форматирования строк, о котором вы можете прочитать здесь . В конечном итоге происходит {}замена get на переменные, которые передаются formatметоду. Таким образом, первый {}будет содержать то, что находится внутри name_without_extension, а второй будет содержать второй аргумент, который просто 1.
idjaw
3
Использование f-строк упрощает это еще больше. из pathlib import Path p = Path (some_path) version = 1 p.rename (Path (p.parent, f "{p.stem} _ {version}" + p.suffix))
Liquidgenius
8

Использование os.rename. Но вы должны передать полный путь обоих файлов к функции. Если у меня есть файл a.txtна рабочем столе, так что я буду делать, а также я должен дать полный переименованный файл тоже.

 os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')
Одинокий волк
источник
1
«Должен» не соответствует действительности. Вы всегда можете заменить относительное имя файла на абсолютное имя файла, и наоборот. Новички обычно кусают то, что они не понимают, как относительные имена файлов связаны с текущим рабочим каталогом.
tripleee
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
Будьте осторожны с этим. Вы не можете всегда chdir()к каталогу, например, что происходит под Windows, когда это UNC? И делать это chdir()имеет побочные эффекты. Я бы предпочел просто указать необходимые пути os.rename()напрямую, но не chdir().
JonBrave
0

Вы можете использовать os.system для вызова терминала для выполнения задачи:

os.system('mv oldfile newfile')

источник
да, это будет работать только на Unix-машинах, как mvи встроенная в Unix программа командной строки для перемещения / переименования файла.
Михаил Гейер
9
Зачем вам вызывать терминал и определять команду UNIX only, если вы можете сделать это из python многоплатформенным способом?
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)
Issam
источник
1
Жесткий код прямой косой черты в качестве разделителя пути и смешивание старого стиля os.pathс современным pathlibдовольно сомнительным. Пройдите весь путь pathlibвместо этого.
tripleee
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")

Это должно сделать это. питон 3+

Нэвин
источник
... или используйте перечисление для чуть более читаемой версии: для ключа fname в перечислении (файлы):…
Николас Д