पायथन का उपयोग करके किसी फ़ाइल का नाम कैसे बदलें


जवाबों:


578

उपयोग करें os.rename:

import os

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

52
यह ध्यान दिया जाना चाहिए कि यदि फाइलें कार्यशील निर्देशिका में नहीं हैं, तो आपको पूर्ण पथ की आवश्यकता होगी।
एंडरमनएपीएम

वास्तव में नहीं, 3.7 ubuntu पर, मेरे लिए काम करता है रिश्तेदार रास्तों का उपयोग करते हुए
toing_toing

2
@toing_toing बेशक, यह काम करता है, वह शायद सिर्फ इसका मतलब है कि आपको वर्तमान निर्देशिका के बारे में पता होना चाहिए, और या तो इसके सापेक्ष पथ निर्दिष्ट करें, या बस निरपेक्ष पथ का उपयोग करें (जैसे C:/folder/file.txtविंडोज /home/file.txtपर या लिनक्स / मैकओएस पर)।
एलेक्स पी।

यह ध्यान देने योग्य है कि यह चुपचाप यूनिक्स जैसी प्रणालियों पर फ़ाइलों को अधिलेखित कर देगा, लेकिन OSErrorविंडोज सिस्टम पर विफल हो जाएगा । os.path.existsयह जांचने के लिए उपयोग किया जाना चाहिए कि क्या नाम बदलने से पहले लक्ष्य मौजूद है। यह बग का उपयोग करने के लिए "समय की जाँच करने का समय" बनाता है, लेकिन यह मुद्दों का कारण बनने की संभावना नहीं है। (मुझे इसके आस-पास कोई आसान रास्ता नहीं है - यहाँ देखें ।
अन्नपूर्णे

2
यदि उपयोगकर्ता वास्तव में फ़ाइल को किसी भी ऑपरेटिंग सिस्टम पर os.replace
बदलना

71

फ़ाइल एक निर्देशिका के अंदर हो सकती है, उस स्थिति में पथ निर्दिष्ट करें:

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

पायथन 3.4 के रूप में कोई भी इसे हल करने के लिए पाथलिब मॉड्यूल का उपयोग कर सकता है ।

यदि आप पुराने संस्करण पर होते हैं, तो आप यहां पाए गए बैकपोर्ट संस्करण का उपयोग कर सकते हैं

मान लेते हैं कि आप रूट पथ में नहीं हैं (बस इसमें थोड़ी कठिनाई जोड़ने के लिए) आप का नाम बदलना चाहते हैं, और एक पूर्ण पथ प्रदान करना है, हम इस पर गौर कर सकते हैं:

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

हम एक साधारण स्ट्रिंग हेरफेर के साथ अपना संशोधन कर सकते हैं:

अजगर 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))

अपनी सादगी दिखाने के लिए जल्द ही:

अजगर 3.6+:

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

पायथन 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पुस्तकालय को 3.4 3.4 में पेश किया गया है , इसलिए यहां जवाब साझा करना भी एक ठोस मॉड्यूल के लिए अपनी बहुमुखी प्रतिभा और अधिक जटिल आवश्यकताओं के उपयोग को प्रदर्शित करने के लिए जोखिम प्रदान करता है।
इदजव

4
धन्यवाद @idjaw, आपकी टिप्पणी हमारे शुरुआती लोगों के मूल प्रश्न का एक अच्छा उत्तर है, एक साधारण आपने ऐसा क्यों किया? । इसके अलावा, यह इंटरनेट पर गैर-शत्रुतापूर्ण दृष्टिकोण को देखने के लिए ताज़ा है जिसे अक्सर अज्ञानी माना जाता है।
इगोर वी।

3
@SasukeUchiha - {}स्ट्रिंग प्रारूपण के लिए हैं, जिसे आप यहां पढ़ सकते हैं । अंततः, क्या हो रहा है कि विधि {}में पारित होने वाले चर के साथ प्रतिस्थापित करें format। तो पहला {}जो है वह पकड़ लेगा name_without_extension, और दूसरा दूसरा तर्क रखेगा जो बस है 1
इडजॉ

3
F- स्ट्रिंग्स का उपयोग करना इसे और भी सरल बनाता है। Pathlib आयात से पथ p = पथ (some_path) संस्करण = 1 p.rename (पथ (p.parent, f "{p.stem} _ {version}" + p.suffix))
लिक्विजेनियस


8

का उपयोग करें os.rename। लेकिन आपको फ़ंक्शन के लिए दोनों फ़ाइलों का पूरा पथ पारित करना होगा। अगर मेरे पास a.txtमेरे डेस्कटॉप पर एक फ़ाइल है तो मैं भी करूँगा और मुझे भी नामांकित फ़ाइल से भरा देना होगा।

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

1
"है" सच नहीं है। आप हमेशा एक निरपेक्ष फ़ाइल नाम के लिए एक रिश्तेदार फ़ाइल नाम स्थानापन्न कर सकते हैं, और इसके विपरीत। आमतौर पर शुरुआती लोगों को जो काटता है, वह यह नहीं समझ पाता है कि रिश्तेदार फ़ाइल नाम वर्तमान कामकाजी निर्देशिका से कैसे संबंधित हैं।
त्रिकाल

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()एक निर्देशिका के लिए नहीं कर सकते हैं , उदाहरण के लिए विंडोज के तहत क्या होता है जब यह एक यूएनसी है? और chdir()इसके साइड-इफेक्ट्स हैं। मैं केवल os.rename()सीधे पथ को निर्दिष्ट करना चाहूंगा , कोई chdir()आईएनजी नहीं ।
जॉनब्र्वे

0

आप कार्य पूरा करने के लिए टर्मिनल का उपयोग करने के लिए os.system का उपयोग कर सकते हैं:

os.system('mv oldfile newfile')

हां, यह केवल एक यूनिक्स-आधारित मशीन पर काम करेगा क्योंकि mvएक फाइल को स्थानांतरित / नाम बदलने के लिए एक यूनिक्स बिलिन कमांडलाइन प्रोग्राम है।
मिखाइल गीयर

8
आप एक टर्मिनल को क्यों आमंत्रित करेंगे और एक UNIX को केवल तब परिभाषित करेंगे जब आप इसे बहु-मंच तरीके से अजगर से कर सकते हैं?
एंडरमनएपीएम

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काफी iffy है। pathlibइसके बजाय सभी तरह से जाओ ।
त्रिकाल

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: ...
निकोलस डी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.