Cara mengganti nama file menggunakan Python

360

Saya ingin berubah a.txtmenjadi b.kml.

zjm1126
sumber

Jawaban:

578

Gunakan os.rename:

import os

os.rename('a.txt', 'b.kml')
KAMU
sumber
52
Perlu dicatat bahwa jika file-file tersebut tidak ada di direktori yang berfungsi, Anda akan memerlukan path lengkap.
EndermanAPM
tidak juga, pada 3.7 ubuntu, bekerja untuk saya menggunakan jalur relatif
toing_toing
2
@toing_toing tentu saja berfungsi, ia mungkin hanya berarti Anda harus mengetahui direktori saat ini, dan tentukan path relatif ke sana, atau cukup gunakan path absolut (seperti C:/folder/file.txtpada Windows atau /home/file.txtpada Linux / MacOS).
Alex P.
Perlu dicatat bahwa ini akan secara diam-diam menimpa file pada sistem mirip Unix tetapi gagal OSErrorpada sistem Windows. os.path.existsharus digunakan untuk memeriksa apakah target ada sebelum mengganti nama. Ini memang membuat bug "Waktu Periksa untuk Penggunaan Saat", tetapi itu tidak menyebabkan masalah. (Saya tahu tidak ada jalan mudah untuk ini - lihat di sini .
AnnanFay
2
Jika pengguna benar-benar ingin file diganti pada sistem operasi apa pun, orang harus menggunakanos.replace
LucG
74

File mungkin ada di dalam direktori, dalam hal ini tentukan path:

import os
old_file = os.path.join("directory", "a.txt")
new_file = os.path.join("directory", "b.kml")
os.rename(old_file, new_file)
Abdul Razak
sumber
50
import shutil

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

Ini akan berfungsi untuk mengganti nama atau memindahkan file.

Andy Balaam
sumber
32
shutil.movebukan pilihan yang baik karena tidak menjadi operasi atom. Jika file terbuka, misalnya, shutil.moveakan membuat file dengan new_name, tetapi tidak akan menghapus file old_namesehingga meninggalkan Anda dengan dua file. os.renamedi sisi lain tidak akan melakukan apa-apa, yang merupakan pilihan yang lebih baik . Dengan shutil.move, bahkan jika Anda menemukan kesalahan, Anda masih harus khawatir tentang memeriksa dan menghapus file jahat. Hanya tidak sepadan ketika alat yang lebih baik ada:os.rename .
mvbentes
34

Pada Python 3.4 orang dapat menggunakan modul pathlib untuk menyelesaikan ini.

Jika Anda menggunakan versi yang lebih lama, Anda dapat menggunakan versi yang di-backport yang ada di sini

Mari kita asumsikan Anda tidak berada di jalur root (hanya untuk menambahkan sedikit kesulitan), Anda ingin mengganti nama, dan harus memberikan path lengkap, kita dapat melihat ini:

some_path = 'a/b/c/the_file.extension'

Jadi, Anda bisa mengambil jalan Anda dan membuat Pathobjek dari itu:

from pathlib import Path
p = Path(some_path)

Hanya untuk memberikan beberapa informasi di sekitar objek yang kita miliki sekarang, kita dapat mengekstraknya. Misalnya, jika karena alasan apa pun kami ingin mengganti nama file dengan memodifikasi nama file dari the_filemenjadi the_file_1, maka kami bisa mendapatkan bagian nama file:

name_without_extension = p.stem

Dan masih memegang ekstensi di tangan juga:

ext = p.suffix

Kita dapat melakukan modifikasi dengan manipulasi string sederhana:

Python 3.6 dan yang lebih besar menggunakan f-string!

new_file_name = f"{name_without_extension}_1"

Jika tidak:

new_file_name = "{}_{}".format(name_without_extension, 1)

Dan sekarang kita dapat melakukan rename dengan memanggil renamemetode pada objek path yang kita buat dan menambahkan extuntuk melengkapi struktur rename yang kita inginkan:

p.rename(Path(p.parent, new_file_name + ext))

Lebih singkat untuk menunjukkan kesederhanaannya:

Python 3.6+:

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, f"{p.stem}_1_{p.suffix}"))

Versi yang kurang dari Python 3.6 menggunakan metode format string sebagai gantinya:

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, "{}_{}_{}".format(p.stem, 1, p.suffix))
idjaw
sumber
3
Mengapa Anda melakukan ini alih-alih jawaban yang diterima? Tampaknya jauh lebih rumit
rbennell
19
Baiklah @rbennell, sebagian besar jawaban ini adalah penjelasan. Jawabannya sebenarnya hanya tiga baris di akhir. Selanjutnya, jawaban yang diterima dibuat secara eksplisit untuk perubahan nama itu sendiri. Jawaban ini menyediakan cara untuk menunjukkan bagaimana Anda dapat memanipulasi nama file untuk mempertahankan bagian yang Anda inginkan di jalur atau nama file. Selanjutnya, pathlibperpustakaan diperkenalkan dengan python 3.4 sehingga berbagi jawaban di sini juga menyediakan paparan untuk modul yang solid untuk menunjukkan fleksibilitas dan penggunaannya untuk persyaratan yang lebih rumit.
idjaw
4
Terima kasih @idjaw, komentar Anda adalah jawaban yang bagus untuk pertanyaan dasar kami pemula, sederhana. Mengapa Anda melakukan itu? . Juga, menyegarkan untuk melihat pendekatan non-bermusuhan di internet untuk apa yang sering dianggap bodoh.
Igor V.
3
@SasukeUchiha - {}Adalah untuk pemformatan string, yang dapat Anda baca di sini . Pada akhirnya, apa yang terjadi adalah bahwa {}diganti dengan variabel yang diteruskan ke formatmetode. Jadi yang pertama {}akan memegang apa yang ada di dalam name_without_extension, dan yang kedua akan memegang argumen kedua yang sederhana 1.
idjaw
3
Menggunakan f-string semakin menyederhanakannya. dari pathlib import Path p = Path (some_path) versi = 1 p.rename (Path (p.parent, f "{p.stem} _ {version}" + p.suffix))
Liquidgenius
8

Gunakan os.rename. Tetapi Anda harus melewati path lengkap dari kedua file ke fungsi. Jika saya memiliki file a.txtdi desktop saya maka saya akan melakukannya dan juga saya harus memberikan file yang penuh nama juga.

 os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')
lonewolf
sumber
1
"Harus" tidak benar. Anda selalu dapat mengganti nama file relatif untuk nama file absolut, dan sebaliknya. Apa yang biasanya menggigit pemula adalah mereka tidak mengerti bagaimana nama file relatif berhubungan dengan direktori kerja saat ini.
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)
Tilak M Divakar
sumber
1
Berhati-hatilah melakukannya dengan cara ini. Anda tidak dapat selalu chdir()ke direktori, mis. Apa yang terjadi di bawah Windows ketika UNC? Dan melakukan chdir()efek samping. Saya lebih suka hanya menentukan jalur yang diperlukan untuk os.rename()langsung, tidak ada chdir().
JonBrave
0

Anda dapat menggunakan os.system untuk memanggil terminal untuk menyelesaikan tugas:

os.system('mv oldfile newfile')

sumber
ya, ini hanya akan bekerja pada mesin berbasis mvunix seperti program commandline unix builtin untuk memindahkan / mengganti nama file.
Mikhail Geyer
9
Mengapa Anda memanggil terminal dan mendefinisikan satu-satunya perintah UNIX ketika Anda bisa melakukannya dari python dengan cara multi-platform?
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)
masalah
sumber
1
Hard-coding forward slash sebagai pemisah jalur dan memadukan gaya lama os.pathdengan modern pathlibcukup meragukan. Pergilah dengan pathlibsebaliknya.
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")

Ini harus dilakukan. python 3+

Naveen
sumber
... atau gunakan enumerasi untuk versi yang sedikit lebih mudah dibaca: untuk kunci, fname dalam enumerate (file): ...
Nicolas D