Як перейменувати файл за допомогою 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

72

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

import os
old_file = os.path.join("directory", "a.txt")
new_file = os.path.join("directory", "b.kml")
os.rename(old_file, new_file)

48
import shutil

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

Це допоможе перейменувати або перемістити файл.


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

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) версія = 1 p.rename (Шлях (p.parent, f "{p.stem} _ {версія}" + 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 для переміщення / перейменування файлу.
Михайло Гейєр

8
Чому ви б викликали термінал і визначали команду UNIX, лише коли це можна зробити з 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)

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+


... або використати перерахування для трохи більш читабельної версії: для ключа, імені в перерахуванні (файли):…
Nicolas D
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.