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

Я хочу изменить a.txt на b.kml.


person zjm1126    schedule 22.03.2010    source источник


Ответы (14)


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

import os

os.rename('a.txt', 'b.kml')
person YOU    schedule 22.03.2010
comment
Следует отметить, что если файлы не находятся в рабочем каталоге, вам понадобится полный путь. - person EndermanAPM; 29.03.2017
comment
не совсем, на 3.7 ubuntu, у меня работает с использованием относительных путей - person toing_toing; 28.02.2019
comment
@toing_toing, конечно, работает, он, вероятно, просто означает, что вы должны знать текущий каталог и либо указать путь относительно него, либо просто использовать абсолютный путь (например, C:/folder/file.txt в Windows или /home/file.txt в Linux / MacOS). - person Alex P.; 26.06.2019
comment
Стоит отметить, что это приведет к незаметной перезаписи файлов в Unix-подобных системах, но не удастся OSError в системах Windows. os.path.exists следует использовать для проверки существования цели перед переименованием. Это действительно создает ошибку Time Of Check to Time Of Use, но вряд ли вызовет проблемы. (Я не знаю простого способа обойти это - см. здесь. - person AnnanFay; 28.09.2019
comment
Если пользователь действительно хочет, чтобы файл был заменен в любой операционной системе, следует использовать os.replace - person LucG; 29.04.2020
comment
os.rename работает, только если источник и место назначения находятся в одной файловой системе. Если вы используете другую файловую систему, вам следует использовать shutil.move. - person cthemudo; 26.01.2021

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

import os
old_file = os.path.join("directory", "a.txt")
new_file = os.path.join("directory", "b.kml")
os.rename(old_file, new_file)
person Abdul Razak    schedule 15.10.2015

import shutil

shutil.move('a.txt', 'b.kml')

Это будет работать для переименования или перемещения файла.

person Andy Balaam    schedule 22.03.2010
comment
shutil.move - не лучший вариант, потому что это не атомарная операция. Например, если файл открыт, shutil.move создаст файл с new_name, но не удалит файл с old_name, поэтому у вас останется два файла. os.rename, с другой стороны, ничего не сделает, что является лучшим вариантом. С shutil.move, даже если вы поймали ошибку, вам все равно придется беспокоиться о проверке и удалении мошеннического файла. Просто не стоит того, когда существует лучший инструмент: os.rename. - person mvbentes; 20.09.2017

Начиная с 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))
person idjaw    schedule 27.07.2017
comment
Почему вы сделали это вместо принятого ответа? Кажется намного сложнее - person rbennell; 07.09.2017
comment
Что ж, @rbennell, большая часть этого ответа - объяснение. На самом деле ответ - всего лишь три строчки в конце. Более того, принятый ответ сделан явно для того самого изменения имени. Этот ответ предоставляет способ показать, как вы можете манипулировать именем файла, чтобы сохранить части, которые вы хотите в пути или имени файла. Кроме того, библиотека pathlib представлена ​​в python 3.4, поэтому совместное использование ответа здесь также дает представление о надежном модуле, чтобы продемонстрировать его универсальность и использование для более сложных требований. - person idjaw; 07.09.2017
comment
Спасибо @idjaw, ваш комментарий - хороший ответ на основной вопрос нас, начинающих, простой Почему вы это сделали?. Кроме того, приятно видеть в Интернете не враждебный подход к тому, что часто считается невежественным. - person Igor V.; 26.04.2018
comment
можешь объяснить строчку: new_file_name = "{}_{}".format(name_without_extension, 1)? Что такое {}_{}? где я могу прочитать об этом подробнее? - person Sasuke Uchiha; 05.05.2018
comment
@SasukeUchiha - {} предназначены для форматирования строк, о чем вы можете прочитать здесь. В конечном итоге происходит то, что {} заменяются переменными, которые передаются методу format. Таким образом, первый {} будет содержать то, что находится в name_without_extension, а второй будет содержать второй аргумент, который просто 1. - person idjaw; 05.05.2018
comment
В дополнение к документам python. pyformat.info содержит множество простых для чтения объяснений и примеров всех видов форматирования строк Python. - person prooffreader; 10.02.2019
comment
Использование f-строк еще больше упрощает это. из pathlib import Path p = Path (some_path) version = 1 p.rename (Path (p.parent, f {p.stem} _ {version} + p.suffix)) - person Liquidgenius; 04.05.2019
comment
+1 для f-strings @idjaw, можете ли вы добавить их, чтобы другие могли получить пользу? :) спасибо за отличный пост. - person Umar.H; 18.09.2019
comment
@Datanovice Спасибо за редактирование и пинг. Я хотел обновить это и забыл. Ваше здоровье. - person idjaw; 18.09.2019
comment
Однако лучше всего использовать и то, и другое, потому что все еще весьма вероятно, что люди не обязательно будут использовать Python 3.6. - person idjaw; 18.09.2019
comment
Ничего страшного, ваш пост помог мне решить некоторые сложные операции ввода-вывода на работе. Благодарю вас за помощь сообществу! - person Umar.H; 18.09.2019

os.rename(old, new)

Это можно найти в документации Python: http://docs.python.org/library/os.html

person Joe    schedule 22.03.2010

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

os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')
person lonewolf    schedule 08.12.2017
comment
Должно быть неправда. Вы всегда можете заменить абсолютное имя файла относительным именем и наоборот. Новичков обычно раздражает то, что они не понимают, как относительные имена файлов соотносятся с текущим рабочим каталогом. - person tripleee; 24.10.2019

Здесь следует отметить один важный момент: мы должны проверить, существуют ли какие-либо файлы с новым именем.

предположим, что если файл b.kml существует, то переименование другого файла с тем же именем приводит к удалению существующего файла b.kml.

import os

if not os.path.exists('b.kml'):
    os.rename('a.txt','b.kml')
person Lohith    schedule 13.02.2021

Использование Path.rename библиотеки Pathlib вместо os .rename:

import pathlib

original_path = pathlib.Path('a.txt')
new_path = original_path.rename('b.kml')
person kym    schedule 16.11.2020
comment
Почему так лучше? - person AnnoyinC; 07.06.2021
comment
Просто использовать этот метод проще, если все ваши пути уже являются объектами Pathlib. - person kym; 09.06.2021

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

Это должно сработать. Python 3+

person Naveen    schedule 30.09.2017
comment
... или используйте enumerate для более удобочитаемой версии: для ключа fname в enumerate (files):… - person Nicolas D; 10.10.2018

Если вы используете Windows и хотите переименовать свои тысячи файлов в папке, то: Вы можете использовать приведенный ниже код. (Python3)

import os

path = os.chdir(input("Enter the path of the Your Image Folder :  ")) #Here put the path of your folder where your images are stored

image_name = input("Enter your Image name : ") #Here, enter the name you want your images to have

i = 0

for file in os.listdir(path):

    new_file_name = image_name+"_" + str(i) + ".jpg" #here you can change the extention of your renmamed file.
    os.rename(file,new_file_name)

    i = i + 1

input("Renamed all Images!!")
person Khan Saad    schedule 19.09.2020

os.chdir (rD: \ Folder1 \ Folder2)
os.rename (src, dst)
#src и dst должны находиться внутри Folder2

person sauravjoshi23    schedule 11.12.2020

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

os.system('mv oldfile newfile')
person Community    schedule 11.01.2016
comment
да, это будет работать только на машине с ОС UNIX, поскольку mv - это встроенная программа командной строки unix для перемещения / переименования файла. - person Mikhail Geyer; 20.11.2016
comment
Зачем вам вызывать терминал и определять команду только для UNIX, если вы можете сделать это из python многоплатформенным способом? - person EndermanAPM; 29.03.2017

person    schedule
comment
Остерегайтесь делать это таким образом. Вы не всегда можете chdir() перейти в каталог, например что происходит под Windows, когда это UNC? И выполнение chdir() имеет побочные эффекты. Я бы предпочел просто указать необходимые пути к os.rename() напрямую, без chdir()ing. - person JonBrave; 22.11.2018

person    schedule
comment
Жестко запрограммировать косую черту в качестве разделителя пути и смешивать старый стиль os.path с современным pathlib довольно сомнительно. Вместо этого пройдите весь путь с pathlib. - person tripleee; 24.10.2019