किसी फ़ाइल को कैसे स्थानांतरित करें?


907

मैंने पायथन osइंटरफ़ेस में देखा , लेकिन एक फ़ाइल को स्थानांतरित करने के लिए एक विधि का पता लगाने में असमर्थ था। मैं $ mv ...पायथन में बराबर कैसे करूंगा ?

>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder

1
आप में से जो ग्नू-कोरुटिल्स mvकमांड से परिचित हैं , अजगर के shutil.moveपास एक किनारे का मामला है जहां shutil.moveफ़ंक्शन अलग है। पूर्ण लेखन के लिए यहां जाएंसंक्षेप में, पायथन द्वारा shutil.moveएक अपवाद उठाया जाएगा (लेकिन ग्नू-कोरुटिल्स mvनहीं होगा) जब आपकी मंजिल एक निर्देशिका है और निर्देशिका में पहले से ही स्रोत के समान नाम वाली फ़ाइल है (अधिक जानकारी के लिए पिछले लिंक में दिए गए लिंक को देखें) )।
ट्रेवर बॉयड स्मिथ

3
कैसे के बारे में os.system("mv file1 file2")?
जॉन स्ट्रोड

जवाबों:


1336

os.rename(), shutil.move()याos.replace()

सभी एक ही वाक्यविन्यास को नियोजित करते हैं:

import os
import shutil

os.rename("path/to/current/file.foo", "path/to/new/destination/for/file.foo")
shutil.move("path/to/current/file.foo", "path/to/new/destination/for/file.foo")
os.replace("path/to/current/file.foo", "path/to/new/destination/for/file.foo")

ध्यान दें कि आपको file.fooस्रोत और गंतव्य तर्क दोनों में फ़ाइल नाम ( ) शामिल करना चाहिए । यदि इसे बदल दिया जाता है, तो फ़ाइल का नाम बदल दिया जाएगा और साथ ही स्थानांतरित कर दिया जाएगा।

यह भी ध्यान दें कि पहले दो मामलों में जिस निर्देशिका में नई फ़ाइल बनाई जा रही है वह पहले से मौजूद होनी चाहिए। विंडोज पर, उस नाम वाली फ़ाइल मौजूद नहीं होनी चाहिए या अपवाद नहीं उठाया os.replace()जाएगा , लेकिन चुपचाप उस घटना में भी एक फ़ाइल को बदल देगा।

जैसा कि अन्य उत्तरों पर टिप्पणियों में उल्लेख किया गया है, shutil.moveबस os.renameज्यादातर मामलों में कॉल करता है। हालाँकि, यदि गंतव्य स्रोत से भिन्न डिस्क पर है, तो वह स्रोत फ़ाइल को कॉपी करेगा और फिर हटा देगा।


8
क्या मैं केवल यही सोचता हूं कि os.rename निर्देशिकाओं के लिए काम नहीं कर रहा है? मैं बोली: "अगर dst एक डायरेक्टरी है, तो OSError खड़ी हो जाएगी।"
फाबियान

33
shutil.moveनिर्देशिकाओं के लिए काम करता है। आप सापेक्ष पथ shutil.move(f.name, "tmp/")या पूर्ण पथ का उपयोग कर सकते हैं shutil.move(f.name, "/Users/hello/tmp/"), पथ का उपयोग न करें ~ , python2.7.9, मैक OS X में जाँच की गई
Whyisyoung

3
~एक शेल कंस्ट्रक्शन है, और फ़ाइल पथ से प्रति se से कोई लेना देना नहीं है, एक गलत सम्मेलन के अलावा अन्य। यदि आप वास्तव में अपने घर निर्देशिका को शामिल करना चाहते हैं, तो os.getenv('HOME')इसके बजाय, यदि आवश्यक हो, तो अपने इच्छित पथ के हिस्सों के साथ इसका उपयोग करें ।
एमएन

15
आप हमेशा ओएस-विशिष्ट नियमों के अनुसार os.path.expanduser()ठीक से विस्तार करने के लिए उपयोग कर सकते हैं ~%HOME%हमेशा से विंडोज पर सेट नहीं होने के कारण बहुत अधिक खाने वाला ।
ig0774

14
os.renameविभिन्न उपकरणों में फ़ाइलों को संभाल नहीं होगा। उपयोग करें shutil.moveयदि आप सुनिश्चित नहीं हैं कि स्रोत और गंतव्य फ़ाइल एक ही डिवाइस पर हैं।
Giuseppe Scrivano

243

हालाँकि os.rename()और shutil.move()दोनों फ़ाइलों का नाम बदल देंगे, कमांड जो Unix mv कमांड के सबसे करीब है shutil.move()। अंतर यह है कि os.rename()अगर स्रोत और गंतव्य अलग-अलग डिस्क पर हैं, तो shutil.move()काम नहीं करता है , जबकि यह परवाह नहीं करता है कि फाइलें किस डिस्क पर हैं।


75
shutil.move()का उपयोग करता os.rename()है, तो गंतव्य वर्तमान फाइल सिस्टम पर है। अन्यथा, shutil.move()स्रोत का उपयोग करके गंतव्य पर प्रतिलिपि बनाता है shutil.copy2()और फिर स्रोत को निकालता है।
लाइन ब्रेक

8
ध्यान रखें कि shutil.copy2()सभी फ़ाइल मेटाडेटा को कॉपी नहीं कर सकते हैं , इसलिए यदि ऐसा होता है कि यह करना पसंद है cp -pऔर फिर rm, मैं इकट्ठा होता हूं।
2rs2ts

9
ज्ञात हो: यदि पहले से ही मौजूद है तो Python 2.7.3 में shutil.move विफल रहता है। इसलिए यदि यह संभव है, या तो त्रुटि को पकड़ें, या मैन्युअल रूप से फ़ाइल / डीआईआर को हटा दें, तो इस कदम को करें।
दाना

36

या तो os.rename या shutil.move के लिए आपको मॉड्यूल आयात करना होगा। सभी फ़ाइलों को स्थानांतरित करने के लिए कोई * वर्ण आवश्यक नहीं है।

हम पर एक फ़ोल्डर है / ऑप्ट / भयानक कहा जाता है एक स्रोत भयानक फ़ाइल के साथ।

in /opt/awesome
  ls
source
  ls source
awesome.txt

python 
>>> source = '/opt/awesome/source'
>>> destination = '/opt/awesome/destination'
>>> import os
>>> os.rename(source, destination)
>>> os.listdir('/opt/awesome')
['destination']

हमने यह देखने के लिए os.listdir का उपयोग किया है कि वास्तव में फ़ोल्डर का नाम बदल गया है। यहां गंतव्य को वापस स्रोत पर ले जाने वाला शिल्ट है।

>>> import shutil
>>> shutil.move(destination, source)
>>> os.listdir('/opt/awesome/source')
['awesome.txt']

इस बार मैंने स्रोत फ़ोल्डर के अंदर जाँच की यह सुनिश्चित करने के लिए कि मैंने जो भयानक फ़ाइल बनाई है वह मौजूद है। यह वहाँ है :)

अब हमने एक फोल्डर और उसकी फाइलों को एक सोर्स से डेस्टिनेशन पर ले जाकर फिर से वापस कर दिया है।


4
docs.python.org/2/library/shutil.html यह दस्तावेज़ीकरण दिखाता है कि आपके पास शटिलवॉव विधि के लिए आपके पैरामीटर स्विच किए गए हैं।
mac10688

1
मैंने गंतव्य और स्रोत का उपयोग किया, यह देखने के लिए कि फाइलें स्रोत से चली गईं और फिर वापस उसी पर चली गईं .... मैं देख सकता था कि यह कैसे स्पष्ट है।
mont

34

पायथन 3.4 के बाद, आप फ़ाइल को स्थानांतरित करने के लिए pathlibवर्ग Pathका भी उपयोग कर सकते हैं ।

from pathlib import Path

Path("path/to/current/file.foo").rename("path/to/new/destination/for/file.foo")

https://docs.python.org/3.4/library/pathlib.html#pathlib.Path.rename


2
"Pathlib आयात पथ से" आयात करने के लिए अच्छा काम करता है :)
तौहीद

14

इस समय मैं इसका उपयोग कर रहा हूं:

import os, shutil
path = "/volume1/Users/Transfer/"
moveto = "/volume1/Users/Drive_Transfer/"
files = os.listdir(path)
files.sort()
for f in files:
    src = path+f
    dst = moveto+f
    shutil.move(src,dst)

अब पूरी तरह कार्यात्मक। आशा है कि यह आपकी मदद करता है।

संपादित करें:

मैंने इसे एक फ़ंक्शन में बदल दिया है, जो एक स्रोत और गंतव्य निर्देशिका को स्वीकार करता है, यदि वह मौजूद नहीं है, तो गंतव्य फ़ोल्डर बना देता है और फ़ाइलों को स्थानांतरित करता है। इसके अलावा src फ़ाइलों को फ़िल्टर करने की अनुमति देता है, उदाहरण के लिए यदि आप केवल छवियों को स्थानांतरित करना चाहते हैं, तो आप पैटर्न का उपयोग करते हैं '*.jpg', डिफ़ॉल्ट रूप से, यह निर्देशिका में सब कुछ स्थानांतरित करता है

import os, shutil, pathlib, fnmatch

def move_dir(src: str, dst: str, pattern: str = '*'):
    if not os.path.isdir(dst):
        pathlib.Path(dst).mkdir(parents=True, exist_ok=True)
    for f in fnmatch.filter(os.listdir(src), pattern):
        shutil.move(os.path.join(src, f), os.path.join(dst, f))

1
आप इसे fnmatch.filter () का उपयोग करके फ़िल्टर किए गए चाल में आसानी से बदल सकते हैं, मेरा संपादन देखें। इसके अलावा, os.path.join(parent_path, filename)क्रास-प्लेटफ़ॉर्म मुद्दों से बचने के लिए स्ट्रिंग
कॉन्सेटेशन के

11

स्वीकृत उत्तर सही नहीं है, क्योंकि सवाल किसी फ़ाइल को फ़ाइल में बदलने का नहीं है, बल्कि कई फ़ाइलों को एक निर्देशिका में ले जाने का है। shutil.moveकाम करेंगे, लेकिन इस उद्देश्य के os.renameलिए बेकार है (जैसा कि टिप्पणियों पर कहा गया है) क्योंकि गंतव्य में एक स्पष्ट फ़ाइल नाम होना चाहिए।


बेकार नहीं, बस कई फ़ाइलों को स्थानांतरित करने के लिए इसे प्राप्त करने के लिए अधिक कार्य की आवश्यकता होती है। आप के साथ फ़ाइल नाम os.path.basename(my_file_path)और फ़ाइल निर्देशिकाओं के साथ प्राप्त कर सकते हैंos.path.dirname(my_file_path) । इसके अतिरिक्त, यह ओपी द्वारा बहुत स्पष्ट नहीं किया गया था यदि वह कई फ़ाइलों को स्थानांतरित करना चाहता था। उन्होंने प्रश्न में केवल एक फ़ाइल को स्थानांतरित करने का उल्लेख किया है, लेकिन उनके उदाहरण कोड में कई फ़ाइलों को स्थानांतरित करने का उल्लेख किया गया है।
जैक्स मैथ्यू

2

यहां वर्णित उत्तर के आधार पर , का उपयोग subprocessकरना एक और विकल्प है।

कुछ इस तरह:

subprocess.call("mv %s %s" % (source_files, destination_folder), shell=True)

मैं इस विधि की तुलना में प्रो और कोन को जानने के लिए उत्सुक हूं shutil। चूंकि मेरे मामले में मैं पहले से ही subprocessअन्य कारणों के लिए उपयोग कर रहा हूं और यह काम करने लगता है मैं इसके साथ रहना पसंद कर रहा हूं।

क्या यह प्रणाली निर्भर है?


2
मेरा मानना ​​है कि यह प्रणाली पर निर्भर होगा। मुझे नहीं लगता mvकि विंडोज़ ऑपरेटिंग सिस्टम पर सफलतापूर्वक उपयोग किया जा रहा है।
जोशुआ Schlichting

0

यह समाधान है, जो shellउपयोग करने में सक्षम नहीं करता है mv

import subprocess

source      = 'pathToCurrent/file.foo'
destination = 'pathToNew/file.foo'

p = subprocess.Popen(['mv', source, destination], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
res = p.communicate()[0].decode('utf-8').strip()

if p.returncode:
    print 'ERROR: ' + res

-2
  import os,shutil

  current_path = "" ## source path

  new_path = "" ## destination path

  os.chdir(current_path)

  for files in os.listdir():

        os.rename(files, new_path+'{}'.format(f))
        shutil.move(files, new_path+'{}'.format(f)) ## to move files from 

अलग डिस्क पूर्व। C: -> D:


यदि आप Python3 का उपयोग कर रहे हैं। # आप नए f-string intrerpolation का उपयोग कर सकते हैं: f"{new_path}{f}"लेकिन यह देखते हुए कि आपके स्ट्रिंग में कोई स्थिर पाठ नहीं है, यह अधिक काम हो सकता है .... मैं उपयोग करने की आदत में शामिल होने की कोशिश कर रहा हूं। f- स्ट्रिंग्स हालांकि।
जुसोपी

क्या आपका मतलब फ़ाइल के बजाय f है?
मत्ती
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.