Python kullanarak bir dosyayı yeniden adlandırma


Yanıtlar:


578

Kullanım os.rename:

import os

os.rename('a.txt', 'b.kml')

52
Dosyalar çalışma dizininde değilse tam yola ihtiyacınız olacaktır.
EndermanAPM

gerçekten değil, 3.7 ubuntu, benim için göreli yollar kullanarak çalışır
toing_toing

2
@toing_toing elbette işe yarıyor, muhtemelen sadece geçerli dizinin farkında olmanız ve ya ona göre yolu belirtmeniz ya da sadece mutlak yolu ( C:/folder/file.txtWindows ya /home/file.txtda Linux / MacOS'ta olduğu gibi) kullanmanız gerektiği anlamına geliyor.
Alex P.

Bunun Unix benzeri sistemlerde dosyaların üzerine sessizce yazacağını, ancak OSErrorWindows sistemlerinde başarısız olacağını belirtmek gerekir . os.path.existsyeniden adlandırmadan önce hedefin mevcut olup olmadığını kontrol etmek için kullanılmalıdır. Bu, "Kullanım Zamanı için Kontrol Zamanı" hatası oluşturur, ancak sorunlara neden olması olası değildir. (Bu konuda kolay bir yol bilmiyorum - buraya bakın .
AnnanFay

2
Kullanıcı aslında dosyanın herhangi bir işletim sisteminde değiştirilmesini istiyorsa, şunu kullanmalıdıros.replace
LucG

74

Dosya bir dizinin içinde olabilir, bu durumda yolu belirtin:

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

Bu, bir dosyayı yeniden adlandırmak veya taşımak için çalışır.


32
shutil.moveatomik bir işlem olmadığı için iyi bir seçenek değildir. Örneğin, dosya açıksa, shutil.moveile bir dosya oluşturur new_name, ancak dosyayı old_nameiki dosyayla birlikte bırakmaz . os.renameÖte yandan hiçbir şey yapmaz, bu daha iyi bir seçenektir . İle shutil.move, hatayı yakalasanız bile, haydut dosyasını kontrol etme ve silme konusunda endişelenmeniz gerekir. Ne zaman Sadece değmez daha iyi bir araç var:os.rename .
mvbentes

34

Python 3.4'ten itibaren bunu çözmek için pathlib modülünü kullanabilirsiniz.

Daha eski bir sürümde bulunuyorsanız, burada bulunan destekli sürümü kullanabilirsiniz

Yeniden adlandırmak istediğiniz kök yolda olmadığınızı varsayalım (sadece ona biraz zorluk eklemek için) ve tam bir yol sağlamak zorundayız, buna bakabiliriz:

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

Böylece, yolunuzu alıp Pathondan bir nesne oluşturabilirsiniz :

from pathlib import Path
p = Path(some_path)

Şu anda sahip olduğumuz bu nesne hakkında bazı bilgiler vermek için, ondan bir şeyler çıkarabiliriz. Sebebi ne olursa olsun biz gelen dosya adını değiştirerek dosyayı yeniden adlandırmak istiyorsanız Örneğin, the_fileiçin the_file_1, o zaman dosya adı bölümünü alabilirsiniz:

name_without_extension = p.stem

Ve yine de uzantıyı elinizde tutun:

ext = p.suffix

Modifikasyonumuzu basit bir dize manipülasyonu ile gerçekleştirebiliriz:

Python 3.6 ve üstü f-dizeleri kullanır!

new_file_name = f"{name_without_extension}_1"

Aksi takdirde:

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

Şimdi, renameoluşturduğumuz yol nesnesindeki yöntemi çağırarak ve extistediğimiz uygun yeniden adlandırma yapısını tamamlamak için ekleyerek yeniden adlandırma işlemini gerçekleştirebiliriz:

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

Basitliğini sergilemek için kısaca:

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'dan küçük sürümler bunun yerine dize biçimi yöntemini kullanır:

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, "{}_{}_{}".format(p.stem, 1, p.suffix))

3
Bunu kabul edilen cevap yerine neden yapasın ki? Çok daha karmaşık görünüyor
rbennell

19
@Rbennell, bu cevabın çoğu bir açıklama. Cevap gerçekten sondaki üç çizgidir. Ayrıca, kabul edilen cevap bu isim değişikliği için açıkça yapılır. Bu yanıt, dosyanın yolunda veya adında istediğiniz parçaları korumak için dosya adını nasıl değiştirebileceğinizi göstermenin bir yolunu sunar. Ayrıca, pathlibkütüphane python 3.4'te tanıtıldığından, cevabın burada paylaşılması, daha karmaşık gereksinimler için çok yönlülüğünü ve kullanımını göstermek için sağlam bir modül için pozlama da sağlar.
idjaw

4
Teşekkürler @idjaw, yorumunuz yeni başlayanlar için temel bir soruya iyi bir cevap, basit Neden bunu yaptın? . Ayrıca, internette genellikle cahil olarak kabul edilen şeylere düşmanca olmayan bir yaklaşım görmek ferahlatıcıdır.
Igor

3
@SasukeUchiha - Burada{} okuyabileceğiniz dize biçimlendirmesi içindir . Nihayetinde olan şey, get'in yönteme iletilen değişkenlerle değiştirilmesidir . Yani birincisi içindekileri tutacak, ikincisi ise basitçe ikinci argümanı tutacak . {}format{}name_without_extension1
idjaw

3
F-stringleri kullanmak onu daha da basitleştirir. pathlib içe aktarma Path p = Path (some_path) sürüm = 1 p.rename (Path (p.parent, f "{p.stem} _ {version}" + p.suffix))
16


8

Kullanın os.rename. Ancak her iki dosyanın da tam yolunu işleve iletmeniz gerekir. Eğer a.txtmasaüstümde bir dosya varsa ben de yapacağım ve ayrıca yeniden adlandırılmış dosya dolu vermek zorunda.

 os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')

1
"Zorunlu" doğru değil. Mutlak bir dosya adı için her zaman göreceli bir dosya adı kullanabilirsiniz veya tam tersi de geçerlidir. Genellikle yeni başlayanları ısırır, göreceli dosya adlarının geçerli çalışma diziniyle ilişkisini anlamıyorlar.
Üçlü

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
Bu şekilde yapmaya dikkat edin. Her zaman chdir()bir dizine gidemezsiniz , örneğin UNC olduğunda Windows altında ne olur? Ve yapmanın chdir()yan etkileri vardır. Sadece os.rename()doğrudan gerekli yolları belirtmek istiyorum , hayır chdir().
JonBrave

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
Yol ayırıcısı olarak eski kodlama ve eski tarzın os.pathmodern ile karıştırılması pathliboldukça zordur. pathlibBunun yerine sonuna kadar git .
Üçlü

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

Bunu yapmalı. python 3+


... ya da biraz daha okunabilir bir sürüm için numaralandırma kullanın: anahtar için, numaralandırmada fname (dosyalar):…
Nicolas D

-1

Görevi gerçekleştirmek üzere terminali çağırmak için os.system komutunu kullanabilirsiniz:

os.system('mv oldfile newfile')

evet, bu mvbir dosyayı taşımak / yeniden adlandırmak için bir unix yerleşik komut satırı programı olarak sadece unix tabanlı bir makinede çalışacaktır .
Mikhail Geyer

10
Neden bir terminali çağırıp bir UNIX komutunu python'dan çok platformlu bir şekilde yapabiliyorsanız tanımlasınız?
EndermanAPM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.