जवाबों:
shutil
कई तरीके हैं जिनका आप उपयोग कर सकते हैं। जिनमें से एक है:
from shutil import copyfile
copyfile(src, dst)
यदि आप os.path
संचालन का उपयोग करते हैं, तो copy
इसके बजाय उपयोग करें copyfile
। केवल तार को स्वीकारcopyfile
करेगा ।
~
┌──────────────────┬────────┬───────────┬───────┬────────────────┐
│ Function │ Copies │ Copies │Can use│ Destination │
│ │metadata│permissions│buffer │may be directory│
├──────────────────┼────────┼───────────┼───────┼────────────────┤
│shutil.copy │ No │ Yes │ No │ Yes │
│shutil.copyfile │ No │ No │ No │ No │
│shutil.copy2 │ Yes │ Yes │ No │ Yes │
│shutil.copyfileobj│ No │ No │ Yes │ No │
└──────────────────┴────────┴───────────┴───────┴────────────────┘
copy2(src,dst)
अक्सर अधिक उपयोगी है copyfile(src,dst)
क्योंकि:
dst
एक होने की निर्देशिका (के बजाय पूरा लक्ष्य फ़ाइल का नाम), जो मामले में basename की src
नई फ़ाइल बनाने के लिए प्रयोग किया जाता है;यहाँ एक छोटा उदाहरण है:
import shutil
shutil.copy2('/src/dir/file.ext', '/dst/dir/newname.ext') # complete target filename given
shutil.copy2('/src/file.ext', '/dst/dir') # target filename is /dst/dir/file.ext
copyfile
की तुलना में काफी तेज हैcopy2
shutil.copy2('/dir/file.ext', '/new/dir/')
(लक्ष्य पथ के बाद स्लैश के साथ) इस पर अस्पष्टता को हटा देगा कि क्या "dir" नामक एक नई फ़ाइल की प्रतिलिपि बनाई जाए या फ़ाइल को उस नाम की निर्देशिका में डाल दिया जाए?
/new/dir
कोई मौजूदा निर्देशिका है तो कोई अस्पष्टता नहीं है , @ MathAlpert की टिप्पणी देखें।
/new/dir/
मौजूद नहीं है, तो पायथन ए को फेंक देगा IsADirectoryError
, अन्यथा यह फ़ाइल को /new/dir/
मूल नाम के तहत कॉपी करता है ।
आप shutil
पैकेज से कॉपी कार्यों में से एक का उपयोग कर सकते हैं :
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ फ़ंक्शन संरक्षण अन्य प्रतियों को स्वीकार करने का समर्थन करता है अनुमति निर्देशिका गंतव्य। फ़ाइल obj मेटाडाटा -------------------------------------------------- ---------------------------- shutil.copy ✔ ✔ ☐ ☐ shutil.copy2 ✔ ✔ ☐ ✔ shutil.copyfile ☐ ☐ ☐ ☐ shutil.copyfileobj ☐ ☐ ✔ ☐ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
उदाहरण:
import shutil
shutil.copy('/etc/hostname', '/var/tmp/testhostname')
पायथन में, आप फ़ाइलों का उपयोग करके कॉपी कर सकते हैं
shutil
मापांकos
मापांकsubprocess
मापांकimport os
import shutil
import subprocess
shutil
मॉड्यूल का उपयोग करके फ़ाइलों को कॉपी करनाshutil.copyfile
हस्ताक्षर
shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copyfile('source.txt', 'destination.txt')
shutil.copy
हस्ताक्षर
shutil.copy(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copy('source.txt', 'destination.txt')
shutil.copy2
हस्ताक्षर
shutil.copy2(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copy2('source.txt', 'destination.txt')
shutil.copyfileobj
हस्ताक्षर
shutil.copyfileobj(src_file_object, dest_file_object[, length])
# example
file_src = 'source.txt'
f_src = open(file_src, 'rb')
file_dest = 'destination.txt'
f_dest = open(file_dest, 'wb')
shutil.copyfileobj(f_src, f_dest)
os
मॉड्यूल का उपयोग करके फ़ाइलों को कॉपी करनाos.popen
हस्ताक्षर
os.popen(cmd[, mode[, bufsize]])
# example
# In Unix/Linux
os.popen('cp source.txt destination.txt')
# In Windows
os.popen('copy source.txt destination.txt')
os.system
हस्ताक्षर
os.system(command)
# In Linux/Unix
os.system('cp source.txt destination.txt')
# In Windows
os.system('copy source.txt destination.txt')
subprocess
मॉड्यूल का उपयोग करके फ़ाइलों को कॉपी करनाsubprocess.call
हस्ताक्षर
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
# example (WARNING: setting `shell=True` might be a security-risk)
# In Linux/Unix
status = subprocess.call('cp source.txt destination.txt', shell=True)
# In Windows
status = subprocess.call('copy source.txt destination.txt', shell=True)
subprocess.check_output
हस्ताक्षर
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
# example (WARNING: setting `shell=True` might be a security-risk)
# In Linux/Unix
status = subprocess.check_output('cp source.txt destination.txt', shell=True)
# In Windows
status = subprocess.check_output('copy source.txt destination.txt', shell=True)
['copy', sourcefile, destfile]
जहाँ भी संभव हो सिंटैक्स का उपयोग करें , खासकर अगर पैरामीटर उपयोगकर्ता इनपुट से हैं।
os.popen
अब थोड़ी देर के लिए पदावनत किया जाता है। और check_output
स्थिति लेकिन उत्पादन (जो के मामले में खाली है वापस नहीं करता है copy/cp
)
किसी फ़ाइल को कॉपी करना अपेक्षाकृत सरल ऑपरेशन है जैसा कि नीचे दिए गए उदाहरणों द्वारा दिखाया गया है, लेकिन आपको इसके बजाय श्टिल स्टडीलिब मॉड्यूल का उपयोग करना चाहिए ।
def copyfileobj_example(source, dest, buffer_size=1024*1024):
"""
Copy a file from source to dest. source and dest
must be file-like objects, i.e. any object with a read or
write method, like for example StringIO.
"""
while True:
copy_buffer = source.read(buffer_size)
if not copy_buffer:
break
dest.write(copy_buffer)
यदि आप फ़ाइल नाम से कॉपी करना चाहते हैं तो आप कुछ ऐसा कर सकते हैं:
def copyfile_example(source, dest):
# Beware, this example does not handle any edge cases!
with open(source, 'rb') as src, open(dest, 'wb') as dst:
copyfileobj_example(src, dst)
shutil.copyfileobj
। इसके अलावा, आपके पास try, finally
अपवादों के बाद फ़ाइलों को बंद करने के लिए कोई विकल्प नहीं है । मैं फिर भी कहूंगा, कि फ़ाइलों को खोलने और बंद करने के लिए आपका कार्य जिम्मेदार नहीं होना चाहिए। यह एक आवरण समारोह में जाना चाहिए, जैसे कि कैसे shutil.copyfile
लपेटता है shutil.copyfileobj
।
dest
लिखने योग्य होना चाहिए :open(dest, 'wb')
शटील मॉड्यूल का उपयोग करें ।
copyfile(src, dst)
Dst नामक फ़ाइल में src नामक फ़ाइल की सामग्री की प्रतिलिपि बनाएँ। गंतव्य स्थान को योग्य होना चाहिए; अन्यथा, IOError अपवाद उठाया जाएगा। यदि dst पहले से मौजूद है, तो इसे बदल दिया जाएगा। चरित्र या ब्लॉक डिवाइस और पाइप जैसी विशेष फ़ाइलों को इस फ़ंक्शन के साथ कॉपी नहीं किया जा सकता है। src और dst स्ट्रिंग्स के रूप में दिए गए पथ नाम हैं।
पर एक नजर डालें filesys सभी फाइल और निर्देशिका से निपटने मानक पायथन मॉड्यूल में उपलब्ध कार्यों के लिए।
निर्देशिका और फ़ाइल कॉपी उदाहरण - टिम गोल्डन के पायथन स्टफ से:
http://timgolden.me.uk/python/win32_how_do_i/copy-a-file.html
import os
import shutil
import tempfile
filename1 = tempfile.mktemp (".txt")
open (filename1, "w").close ()
filename2 = filename1 + ".copy"
print filename1, "=>", filename2
shutil.copy (filename1, filename2)
if os.path.isfile (filename2): print "Success"
dirname1 = tempfile.mktemp (".dir")
os.mkdir (dirname1)
dirname2 = dirname1 + ".copy"
print dirname1, "=>", dirname2
shutil.copytree (dirname1, dirname2)
if os.path.isdir (dirname2): print "Success"
सबसे पहले, मैंने आपके संदर्भ के लिए शेटिल विधियों की एक विस्तृत धोखा दे दिया।
shutil_methods =
{'copy':['shutil.copyfileobj',
'shutil.copyfile',
'shutil.copymode',
'shutil.copystat',
'shutil.copy',
'shutil.copy2',
'shutil.copytree',],
'move':['shutil.rmtree',
'shutil.move',],
'exception': ['exception shutil.SameFileError',
'exception shutil.Error'],
'others':['shutil.disk_usage',
'shutil.chown',
'shutil.which',
'shutil.ignore_patterns',]
}
दूसरी बात, एक्सैम्पल्स में कॉपी के तरीके बताएं:
shutil.copyfileobj(fsrc, fdst[, length])
खुली हुई वस्तुओं में हेरफेर करना
In [3]: src = '~/Documents/Head+First+SQL.pdf'
In [4]: dst = '~/desktop'
In [5]: shutil.copyfileobj(src, dst)
AttributeError: 'str' object has no attribute 'read'
#copy the file object
In [7]: with open(src, 'rb') as f1,open(os.path.join(dst,'test.pdf'), 'wb') as f2:
...: shutil.copyfileobj(f1, f2)
In [8]: os.stat(os.path.join(dst,'test.pdf'))
Out[8]: os.stat_result(st_mode=33188, st_ino=8598319475, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067347, st_mtime=1516067335, st_ctime=1516067345)
shutil.copyfile(src, dst, *, follow_symlinks=True)
कॉपी और नाम बदलें
In [9]: shutil.copyfile(src, dst)
IsADirectoryError: [Errno 21] Is a directory: ~/desktop'
#so dst should be a filename instead of a directory name
shutil.copy()
मेटाडेटा की जानकारी के बिना कॉपी करें
In [10]: shutil.copy(src, dst)
Out[10]: ~/desktop/Head+First+SQL.pdf'
#check their metadata
In [25]: os.stat(src)
Out[25]: os.stat_result(st_mode=33188, st_ino=597749, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516066425, st_mtime=1493698739, st_ctime=1514871215)
In [26]: os.stat(os.path.join(dst, 'Head+First+SQL.pdf'))
Out[26]: os.stat_result(st_mode=33188, st_ino=8598313736, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516066427, st_mtime=1516066425, st_ctime=1516066425)
# st_atime,st_mtime,st_ctime changed
shutil.copy2()
मेटाडेटा को प्रिज़िट करने के साथ कॉपी करें
In [30]: shutil.copy2(src, dst)
Out[30]: ~/desktop/Head+First+SQL.pdf'
In [31]: os.stat(src)
Out[31]: os.stat_result(st_mode=33188, st_ino=597749, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067055, st_mtime=1493698739, st_ctime=1514871215)
In [32]: os.stat(os.path.join(dst, 'Head+First+SQL.pdf'))
Out[32]: os.stat_result(st_mode=33188, st_ino=8598313736, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067063, st_mtime=1493698739, st_ctime=1516067055)
# Preseved st_mtime
shutil.copytree()
गंतव्य निर्देशिका को लौटाते हुए, src पर निहित संपूर्ण निर्देशिका ट्री की प्रतिलिपि बनाएँ
छोटी फ़ाइलों के लिए और केवल अजगर निर्मित इन्स का उपयोग करके, आप निम्न एक-लाइनर का उपयोग कर सकते हैं:
with open(source, 'rb') as src, open(dest, 'wb') as dst: dst.write(src.read())
जैसा कि @maxschlepzig ने नीचे टिप्पणियों में उल्लेख किया है, यह उन अनुप्रयोगों के लिए इष्टतम तरीका नहीं है जहां फ़ाइल बहुत बड़ी है या जब स्मृति महत्वपूर्ण है, इस प्रकार स्वाति के जवाब को प्राथमिकता दी जानी चाहिए।
.read()
और .write()
(कम से कम CPython के लिए) डिफ़ॉल्ट रूप से बफ़र कर रहे हैं।
open()
IO डिफ़ॉल्ट रूप से बफ़र करता है, यहाँ आपकी मदद नहीं करता है, क्योंकि read()
यह निर्दिष्ट किया जाता है: 'यदि n ऋणात्मक या छोड़ा गया है, तो EOF तक पढ़ें।' इसका मतलब है कि read()
एक स्ट्रिंग के रूप में पूर्ण फ़ाइल सामग्री देता है।
आप उपयोग कर सकते हैं os.system('cp nameoffilegeneratedbyprogram /otherdirectory/')
या जैसा मैंने किया,
os.system('cp '+ rawfile + ' rawdata.dat')
कहाँ पे rawfile
वह नाम है जो मैंने कार्यक्रम के अंदर उत्पन्न किया था।
यह एक लिनक्स केवल समाधान है
shutil
उपलब्ध नहीं है तब भी - subprocess.run()
(बिना shell=True
!) बेहतर विकल्प है os.system()
।
subprocess.run()
जैसा कि @maxschlepzig द्वारा सुझाया गया है, बाहरी कार्यक्रमों को कॉल करते समय एक बड़ा कदम है। हालांकि लचीलेपन और सुरक्षा के लिए, ['cp', rawfile, 'rawdata.dat']
कमांड लाइन को पारित करने के रूप का उपयोग करें । (हालांकि, नकल के लिए, shutil
और दोस्तों को किसी बाहरी कार्यक्रम को बुलाने की सिफारिश की जाती है।)
बड़ी फ़ाइलों के लिए, मैंने जो किया वह फ़ाइल लाइन लाइन द्वारा पढ़ा गया और प्रत्येक पंक्ति को एक सरणी में पढ़ा। फिर, एक बार सरणी एक निश्चित आकार तक पहुँच गई, इसे एक नई फ़ाइल में जोड़ें।
for line in open("file.txt", "r"):
list.append(line)
if len(list) == 1000000:
output.writelines(list)
del list[:]
for l in open('file.txt','r'): output.write(l)
काम करना चाहिए; बस अपनी आवश्यकताओं के लिए उत्पादन धारा बफर सेटअप। या जब आप एक बार में लिखना चाहते हैं, तो बाइट्स की संख्या output.write(read(n)); output.flush()
कहाँ n
है, इसके साथ एक कोशिश में लूप करके आप बाइट्स से जा सकते हैं । इन दोनों के पास यह जांचने की भी शर्त नहीं है कि यह बोनस है।
shutil
? नजरअंदाज करने पर भी shutil
, एक साधारण ब्लॉक रीड / राइट लूप (अनबॉर्फ किए गए IO का उपयोग करते हुए) सीधे आगे है, कुशल होगा और इससे बहुत अधिक समझ में आएगा, और इस तरह से पढ़ाना और समझना आसान है।
from subprocess import call
call("cp -p <file> <file>", shell=True)
call
असुरक्षित है। कृपया इसके बारे में सबप्रोसेस डेरे को देखें।
पायथन 3.5 के रूप में आप निम्न फ़ाइलों के लिए निम्न कार्य कर सकते हैं (जैसे: पाठ फ़ाइलें, छोटे jpegs)
from pathlib import Path
source = Path('../path/to/my/file.txt')
destination = Path('../path/where/i/want/to/store/it.txt')
destination.write_bytes(source.read_bytes())
write_bytes
गंतव्य के स्थान पर जो कुछ भी था उसे अधिलेखित कर देगा
shutil
आपके लिए सभी विशेष मामलों को संभालता है और आपको मानसिक शांति प्रदान करता है।
open(destination, 'wb').write(open(source, 'rb').read())
स्रोत फ़ाइल को रीड मोड में खोलें, और गंतव्य फ़ाइल को राइट मोड में लिखें।
.close()
उन सभी पर याद नहीं है open(...)
?
पायथन ऑपरेटिंग सिस्टम शेल उपयोगिताओं का उपयोग करके आसानी से फ़ाइलों की प्रतिलिपि बनाने के लिए अंतर्निहित कार्य प्रदान करता है।
फाइल को कॉपी करने के लिए निम्न कमांड का उपयोग किया जाता है
shutil.copy(src,dst)
मेटाडाटा सूचना के साथ फाइल को कॉपी करने के लिए निम्न कमांड का उपयोग किया जाता है
shutil.copystat(src,dst)
copy
तब चलना चाहिए copystat
। पायथन 3.3+ में copystat
भी विस्तारित विशेषताओं को कॉपी करता है।