मैं पायथन में एक फ़ाइल की प्रतिलिपि कैसे बनाऊं?


2473

मैं पायथन में एक फ़ाइल की प्रतिलिपि कैसे बनाऊं?

मुझे कुछ भी नहीं मिला os


117
ऐसा लगता है कि cp एक सिस्टम कॉल नहीं है और इसलिए यह ओएस मॉड्यूल से संबंधित नहीं है। यह एक शेल कमांड है, इसलिए इसे शटील मॉड्यूल में रखा जाता है।
Waldol1

जवाबों:


3003

shutilकई तरीके हैं जिनका आप उपयोग कर सकते हैं। जिनमें से एक है:

from shutil import copyfile
copyfile(src, dst)
  • Dst नामक फ़ाइल में src नामक फ़ाइल की सामग्री की प्रतिलिपि बनाएँ ।
  • गंतव्य स्थान को योग्य होना चाहिए; अन्यथा, IOError अपवाद उठाया जाएगा।
  • यदि dst पहले से मौजूद है, तो इसे बदल दिया जाएगा।
  • चरित्र या ब्लॉक डिवाइस और पाइप जैसी विशेष फ़ाइलों को इस फ़ंक्शन के साथ कॉपी नहीं किया जा सकता है।
  • प्रतिलिपि के साथ , src और dst स्ट्रिंग्स के रूप में दिए गए पथ नाम हैं

यदि आप os.pathसंचालन का उपयोग करते हैं, तो copyइसके बजाय उपयोग करें copyfileकेवल तार को स्वीकारcopyfile करेगा ।


147
कॉपी और कॉपीफाइल में क्या अंतर है?
मैट

385
प्रतिलिपि में (src, dst) dst एक निर्देशिका हो सकती है।
ओवेन

41
ध्यान दें कि आपके प्लेटफॉर्म के आधार पर सभी मेटाडेटा की प्रतिलिपि नहीं बनाई जाएगी।
केविन हॉर्न

12
ध्यान दें कि यह एक परमाणु ऑपरेशन नहीं है। थ्रेडेड एप्लिकेशन में इसका उपयोग करने का ध्यान रखें।
वाटरबेट

4
ध्यान दें कि यह ~
कथानक को

1250
┌──────────────────┬────────┬───────────┬───────┬────────────────┐
│     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       │
└──────────────────┴────────┴───────────┴───────┴────────────────┘

732

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

19
मैं 1 मिलियन फ़ाइलों से 100k फ़ाइलों को बेतरतीब ढंग से कॉपी करने की कोशिश कर रहा हूं। copyfileकी तुलना में काफी तेज हैcopy2
विजय

4
क्या मैं यह मानने के लिए सही हूं कि shutil.copy2('/dir/file.ext', '/new/dir/')(लक्ष्य पथ के बाद स्लैश के साथ) इस पर अस्पष्टता को हटा देगा कि क्या "dir" नामक एक नई फ़ाइल की प्रतिलिपि बनाई जाए या फ़ाइल को उस नाम की निर्देशिका में डाल दिया जाए?
जक

1
@ वीजे मेरा मानना ​​है कि यह ओवरहेड मेटाडेटा की नकल करने के कारण है।
जोनाथन एच

@Zak यदि /new/dirकोई मौजूदा निर्देशिका है तो कोई अस्पष्टता नहीं है , @ MathAlpert की टिप्पणी देखें।
जोनाथन एच।

@Zak आप सही हैं, अंत में एक स्लैश जोड़ने से अस्पष्टता दूर होती है। यदि /new/dir/मौजूद नहीं है, तो पायथन ए को फेंक देगा IsADirectoryError, अन्यथा यह फ़ाइल को /new/dir/मूल नाम के तहत कॉपी करता है ।
मार्टनबॉग्नर

125

आप shutilपैकेज से कॉपी कार्यों में से एक का उपयोग कर सकते हैं :

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
फ़ंक्शन संरक्षण अन्य प्रतियों को स्वीकार करने का समर्थन करता है
                      अनुमति निर्देशिका गंतव्य। फ़ाइल obj मेटाडाटा  
-------------------------------------------------- ----------------------------
shutil.copy               ✔ ✔ ☐ ☐
 shutil.copy2              ✔ ✔ ☐ ✔
 shutil.copyfile           ☐ ☐ ☐ ☐
 shutil.copyfileobj        ☐ ☐ ✔ ☐
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━

उदाहरण:

import shutil
shutil.copy('/etc/hostname', '/var/tmp/testhostname')

10
बस जिज्ञासु, आपने उस तालिका को कैसे उत्पन्न किया?
लाइटकेमिस्ट

16
@lightalchemist मैंने सिर्फ एक स्क्रैडपैड के रूप में विम का उपयोग किया, एक विकिपीडिया तालिका से उपयोग किए गए यूनिकोड प्रतीकों की प्रतिलिपि बनाई और अंतिम पॉलिशिंग के लिए स्टैकओवरफ़्लो संपादक में परिणाम की प्रतिलिपि बनाई।
मैक्सक्लेपज़िग

3
यह 2 साल पहले के अन्य उत्तर से कैसे भिन्न है? stackoverflow.com/a/30359308/674039
wim

1
@wim, आपको मेरे उत्तर के 2017 संस्करण के साथ मेरे उत्तर की तुलना करनी होगी, जो आपके लिंक से जुड़ा था, जब मैंने अपना उत्तर पोस्ट किया था। मुख्य अंतर: मेरा उत्तर बेहतर / अधिक वर्णनात्मक कॉलम हेडर का उपयोग करता है, टेबल लेआउट विचलित नहीं होता है, इसमें डोक्यूमिनेशन में सीधे लिंक शामिल होते हैं और मैंने एक कॉलम जोड़ा (यानी 'फ़ाइल obj स्वीकार करता है')।
21

4
ठीक। YMMV, लेकिन मुझे लगता है कि कॉस्मेटिक बदलाव और छोटे सुधार जैसे कि मौजूदा उत्तरों पर संपादन के बजाय, उत्तरों के दोहराव से बेहतर होते हैं।
wim

104

पायथन में, आप फ़ाइलों का उपयोग करके कॉपी कर सकते हैं


import os
import shutil
import subprocess

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

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

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


9
सिंगल-स्ट्रिंग कमांड का उपयोग करना खराब कोडिंग स्टाइल (लचीलापन, विश्वसनीयता और सुरक्षा) है, इसके बजाय ['copy', sourcefile, destfile]जहाँ भी संभव हो सिंटैक्स का उपयोग करें , खासकर अगर पैरामीटर उपयोगकर्ता इनपुट से हैं।
मार्सेल वाल्डवोगेल

8
आप शटर कॉपी फ़ंक्शन के इतने बुरे विकल्प क्यों सूचीबद्ध करते हैं?
मैक्सक्लेपज़िग

6
शिल्ट बिल्ट-इन है, गैर-पोर्टेबल विकल्प प्रदान करने की आवश्यकता नहीं है। सिस्टम आश्रित समाधानों को हटाकर उत्तर को वास्तव में बेहतर बनाया जा सकता है, और उस हटाने के बाद, यह उत्तर मौजूदा उत्तरों की एक प्रति / प्रलेखन की एक प्रति है।
जीन फ़्राँस्वा Fabre

3
os.popenअब थोड़ी देर के लिए पदावनत किया जाता है। और check_outputस्थिति लेकिन उत्पादन (जो के मामले में खाली है वापस नहीं करता है copy/cp)
जीन फ़्राँस्वा Fabre

2
शील वास्तव में फाइलों की नकल नहीं करता है। नहीं है डॉक्स के शीर्ष पर एक बड़ा वसा चेतावनी सही । "इसका मतलब है कि फ़ाइल स्वामी और समूह एसीएल के साथ-साथ खो जाते हैं। मैक ओएस पर, संसाधन कांटा और अन्य मेटाडेटा का उपयोग नहीं किया जाता है। इसका मतलब है कि संसाधन खो जाएंगे और फ़ाइल प्रकार और निर्माता कोड विंडोज पर सही नहीं होंगे।" फ़ाइल स्वामियों, ACL और वैकल्पिक डेटा स्ट्रीम की प्रतिलिपि नहीं बनाई गई है। "
gman

96

किसी फ़ाइल को कॉपी करना अपेक्षाकृत सरल ऑपरेशन है जैसा कि नीचे दिए गए उदाहरणों द्वारा दिखाया गया है, लेकिन आपको इसके बजाय श्टिल स्टडीलिब मॉड्यूल का उपयोग करना चाहिए ।

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)

25
मैंने कुछ समय पहले कि मॉड्यूल shutil (एकवचन) नहीं shutils (बहुवचन) कहा जाता है पर गौर किया और वास्तव में यह है अजगर 2.3 में। फिर भी मैं इस फ़ंक्शन को एक उदाहरण के रूप में यहां छोड़ता हूं।
पी।

4
फ़ाइल की सामग्री की प्रतिलिपि बनाना एक सीधा ऑपरेशन है। फ़ाइल को उसके मेटाडेटा के साथ कॉपी करना कुछ भी लेकिन सीधा है, तो और भी अगर आप क्रॉस-प्लेटफ़ॉर्म बनना चाहते हैं।
लाक

3
सच। शटर डॉक्स को देखते हुए, कॉपीफाइल फ़ंक्शन भी मेटाडेटा की प्रतिलिपि नहीं बनाएगा।
पी।

3
हां, मुझे यकीन नहीं है कि आप इसके स्रोत की नकल क्यों नहीं करेंगे shutil.copyfileobj। इसके अलावा, आपके पास try, finallyअपवादों के बाद फ़ाइलों को बंद करने के लिए कोई विकल्प नहीं है । मैं फिर भी कहूंगा, कि फ़ाइलों को खोलने और बंद करने के लिए आपका कार्य जिम्मेदार नहीं होना चाहिए। यह एक आवरण समारोह में जाना चाहिए, जैसे कि कैसे shutil.copyfileलपेटता है shutil.copyfileobj
ErlVolton

2
उपर्युक्त कोड को destलिखने योग्य होना चाहिए :open(dest, 'wb')
user1016274

69

शटील मॉड्यूल का उपयोग करें ।

copyfile(src, dst)

Dst नामक फ़ाइल में src नामक फ़ाइल की सामग्री की प्रतिलिपि बनाएँ। गंतव्य स्थान को योग्य होना चाहिए; अन्यथा, IOError अपवाद उठाया जाएगा। यदि dst पहले से मौजूद है, तो इसे बदल दिया जाएगा। चरित्र या ब्लॉक डिवाइस और पाइप जैसी विशेष फ़ाइलों को इस फ़ंक्शन के साथ कॉपी नहीं किया जा सकता है। src और dst स्ट्रिंग्स के रूप में दिए गए पथ नाम हैं।

पर एक नजर डालें filesys सभी फाइल और निर्देशिका से निपटने मानक पायथन मॉड्यूल में उपलब्ध कार्यों के लिए।


शील वास्तव में फाइलों की नकल नहीं करता है। नहीं है डॉक्स के शीर्ष पर एक बड़ा वसा चेतावनी सही । "इसका मतलब है कि फ़ाइल स्वामी और समूह एसीएल के साथ-साथ खो जाते हैं। मैक ओएस पर, संसाधन कांटा और अन्य मेटाडेटा का उपयोग नहीं किया जाता है। इसका मतलब है कि संसाधन खो जाएंगे और फ़ाइल प्रकार और निर्माता कोड विंडोज पर सही नहीं होंगे।" फ़ाइल स्वामियों, ACL और वैकल्पिक डेटा स्ट्रीम की प्रतिलिपि नहीं बनाई गई है। "
gman

47

निर्देशिका और फ़ाइल कॉपी उदाहरण - टिम गोल्डन के पायथन स्टफ से:

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"

24

सबसे पहले, मैंने आपके संदर्भ के लिए शेटिल विधियों की एक विस्तृत धोखा दे दिया।

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',]
}

दूसरी बात, एक्सैम्पल्स में कॉपी के तरीके बताएं:

  1. 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)
  1. 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
  1. 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
  1. 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
  1. shutil.copytree()

गंतव्य निर्देशिका को लौटाते हुए, src पर निहित संपूर्ण निर्देशिका ट्री की प्रतिलिपि बनाएँ


1
शील वास्तव में फाइलों की नकल नहीं करता है। नहीं है डॉक्स के शीर्ष पर एक बड़ा वसा चेतावनी सही । "इसका मतलब है कि फ़ाइल स्वामी और समूह एसीएल के साथ-साथ खो जाते हैं। मैक ओएस पर, संसाधन कांटा और अन्य मेटाडेटा का उपयोग नहीं किया जाता है। इसका मतलब है कि संसाधन खो जाएंगे और फ़ाइल प्रकार और निर्माता कोड विंडोज पर सही नहीं होंगे।" फ़ाइल स्वामियों, ACL और वैकल्पिक डेटा स्ट्रीम की प्रतिलिपि नहीं बनाई गई है। "
gman

19

छोटी फ़ाइलों के लिए और केवल अजगर निर्मित इन्स का उपयोग करके, आप निम्न एक-लाइनर का उपयोग कर सकते हैं:

with open(source, 'rb') as src, open(dest, 'wb') as dst: dst.write(src.read())

जैसा कि @maxschlepzig ने नीचे टिप्पणियों में उल्लेख किया है, यह उन अनुप्रयोगों के लिए इष्टतम तरीका नहीं है जहां फ़ाइल बहुत बड़ी है या जब स्मृति महत्वपूर्ण है, इस प्रकार स्वाति के जवाब को प्राथमिकता दी जानी चाहिए।


3
यह संपूर्ण स्रोत फ़ाइल को वापस लिखने से पहले मेमोरी में पढ़ता है। इस प्रकार, यह अनावश्यक रूप से सभी लेकिन सबसे छोटी फ़ाइल कॉपी ऑपरेशन के लिए मेमोरी बर्बाद करता है।
maxschlepzig

1
क्या यह सच है? मुझे लगता है कि .read()और .write()(कम से कम CPython के लिए) डिफ़ॉल्ट रूप से बफ़र कर रहे हैं।
साउंडस्ट्रिप

@soundstripe, बेशक यह सच है। तथ्य यह है कि फ़ाइल ऑब्जेक्ट द्वारा लौटाया गया open()IO डिफ़ॉल्ट रूप से बफ़र करता है, यहाँ आपकी मदद नहीं करता है, क्योंकि read()यह निर्दिष्ट किया जाता है: 'यदि n ऋणात्मक या छोड़ा गया है, तो EOF तक पढ़ें।' इसका मतलब है कि read()एक स्ट्रिंग के रूप में पूर्ण फ़ाइल सामग्री देता है।
मैक्सक्लेपजिग

@ maxschlepzig मुझे आपकी बात अच्छी लगी और मैं मानता हूं कि मुझे इसकी जानकारी नहीं थी। मेरे द्वारा यह उत्तर देने का कारण यह था कि कोई व्यक्ति केवल बिल्ट-इन का उपयोग करके एक साधारण फ़ाइल कॉपी करना चाहता था, इसके लिए एक मॉड्यूल आयात करने की आवश्यकता के बिना। यदि आप यह विकल्प चाहते हैं तो निश्चित रूप से मेमोरी ऑप्टिमाइज़ेशन एक चिंता का विषय नहीं होना चाहिए। वैसे भी बाहर समाशोधन के लिए धन्यवाद। मैंने उसी हिसाब से जवाब अपडेट किया।
पीला 01

14

आप उपयोग कर सकते हैं os.system('cp nameoffilegeneratedbyprogram /otherdirectory/')

या जैसा मैंने किया,

os.system('cp '+ rawfile + ' rawdata.dat')

कहाँ पे rawfileवह नाम है जो मैंने कार्यक्रम के अंदर उत्पन्न किया था।

यह एक लिनक्स केवल समाधान है


10
यह पोर्टेबल नहीं है, और अनावश्यक है क्योंकि आप सिर्फ शिल्ट का उपयोग कर सकते हैं।
कोरी गोल्डबर्ग

4
जब shutilउपलब्ध नहीं है तब भी - subprocess.run() (बिना shell=True!) बेहतर विकल्प है os.system()
मैक्सक्लेपज़िग

1
शटील अधिक पोर्टेबल है
Hiadore

1
subprocess.run()जैसा कि @maxschlepzig द्वारा सुझाया गया है, बाहरी कार्यक्रमों को कॉल करते समय एक बड़ा कदम है। हालांकि लचीलेपन और सुरक्षा के लिए, ['cp', rawfile, 'rawdata.dat']कमांड लाइन को पारित करने के रूप का उपयोग करें । (हालांकि, नकल के लिए, shutilऔर दोस्तों को किसी बाहरी कार्यक्रम को बुलाने की सिफारिश की जाती है।)
मार्सेल वाल्डवोगेल

2
इसमें रिक्त स्थान के साथ फ़ाइल नाम के साथ प्रयास करें।
जीन फ़्राँस्वा Fabre

11

बड़ी फ़ाइलों के लिए, मैंने जो किया वह फ़ाइल लाइन लाइन द्वारा पढ़ा गया और प्रत्येक पंक्ति को एक सरणी में पढ़ा। फिर, एक बार सरणी एक निश्चित आकार तक पहुँच गई, इसे एक नई फ़ाइल में जोड़ें।

for line in open("file.txt", "r"):
    list.append(line)
    if len(list) == 1000000: 
        output.writelines(list)
        del list[:]

2
यह थोड़ा बेमानी लगता है क्योंकि लेखक को बफरिंग को संभालना चाहिए। for l in open('file.txt','r'): output.write(l)काम करना चाहिए; बस अपनी आवश्यकताओं के लिए उत्पादन धारा बफर सेटअप। या जब आप एक बार में लिखना चाहते हैं, तो बाइट्स की संख्या output.write(read(n)); output.flush()कहाँ nहै, इसके साथ एक कोशिश में लूप करके आप बाइट्स से जा सकते हैं । इन दोनों के पास यह जांचने की भी शर्त नहीं है कि यह बोनस है।
का मालिक है

1
हां, लेकिन मुझे लगा कि शायद यह समझना आसान हो सकता है क्योंकि यह उनके हिस्सों के बजाय पूरी लाइनों को कॉपी करता है (यदि हम नहीं जानते कि प्रत्येक पंक्ति कितनी बाइट्स है)।
ytpillai

सच सच। दक्षता के लिए शिक्षण और कोडिंग के लिए कोडिंग बहुत अलग हैं।
का मालिक है

1
स्रोत को देखते हुए - रिटलाइन कॉल राइट, hg.python.org/cpython/file/c6880edaf6f3/Modules/_io/bytesio.c । इसके अलावा, फ़ाइल स्ट्रीम पहले से ही खुली है, इसलिए इसे हर बार फिर से लिखने की आवश्यकता नहीं है।
मालिक

2
यह भयानक है। यह बिना किसी अच्छे कारण के अनावश्यक काम करता है। यह मनमानी फ़ाइलों के लिए काम नहीं करता है। यदि इनपुट में विंडोज जैसे सिस्टम पर असामान्य लाइन एंडिंग है तो कॉपी बाइट-समान नहीं है। आप ऐसा क्यों सोचते हैं कि कॉल को कॉपी फ़ंक्शन के लिए समझने की तुलना में यह समझना आसान हो सकता है shutil? नजरअंदाज करने पर भी shutil, एक साधारण ब्लॉक रीड / राइट लूप (अनबॉर्फ किए गए IO का उपयोग करते हुए) सीधे आगे है, कुशल होगा और इससे बहुत अधिक समझ में आएगा, और इस तरह से पढ़ाना और समझना आसान है।
मैक्सचेलपिजिग

11
from subprocess import call
call("cp -p <file> <file>", shell=True)

10
यह प्लेटफॉर्म पर निर्भर करता है, इसलिए मैं इसका उपयोग नहीं करूंगा।
केविन मीयर

5
इस तरह के एक callअसुरक्षित है। कृपया इसके बारे में सबप्रोसेस डेरे को देखें।
buhtz

2
यह पोर्टेबल नहीं है, और अनावश्यक है क्योंकि आप सिर्फ शिल्ट का उपयोग कर सकते हैं।
कोरी गोल्डबर्ग

2
हम्म क्यों पायथन, फिर?
बारिस डेमीरे

शायद शुरू करने से पहले ऑपरेटिंग सिस्टम का पता लगाएं (चाहे वह डॉस या यूनिक्स हो, क्योंकि वे दो सबसे अधिक उपयोग किए जाते हैं)
मिल्कीवेय

8

पायथन 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 गंतव्य के स्थान पर जो कुछ भी था उसे अधिलेखित कर देगा


2
और फिर कोई बड़ी फ़ाइल पर कोड (गलती से या उद्देश्यपूर्ण) का उपयोग करता है ... shutilआपके लिए सभी विशेष मामलों को संभालता है और आपको मानसिक शांति प्रदान करता है।
मार्सेल वाल्डवोगेल

4
कम से कम यह एक ही समाधान को बार-बार नहीं दोहराता है।
जीन फ़्राँस्वा Fabre

6
open(destination, 'wb').write(open(source, 'rb').read())

स्रोत फ़ाइल को रीड मोड में खोलें, और गंतव्य फ़ाइल को राइट मोड में लिखें।


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

1
सभी उत्तरों को स्पष्टीकरण की आवश्यकता है, भले ही यह एक वाक्य हो। कोई भी स्पष्टीकरण खराब मिसाल नहीं देता है और यह कार्यक्रम को समझने में मददगार नहीं है। क्या होगा अगर एक पूरा अजगर नोब के साथ आया और उसने यह देखा, इसका उपयोग करना चाहता था, लेकिन क्योंकि वे इसे समझ नहीं पाए? आप अपने उत्तरों में सभी के लिए सहायक बनना चाहते हैं।
संयोजकचर्चा

1
कि .close()उन सभी पर याद नहीं है open(...)?
भाग्योदयवाद

.Close () की कोई आवश्यकता नहीं है, क्योंकि हम फ़ाइल पॉइंटर ऑब्जेक्ट को कहीं भी स्टोर नहीं कर रहे हैं (न तो src फ़ाइल के लिए और न ही गंतव्य फ़ाइल के लिए)।
S471

1
येलो 01 के जवाब के रूप में एक ही उप- अपनाने वाली मेमोरी-बर्बाद करने का दृष्टिकोण ।
मैक्सचेलपिजिग

-3

पायथन ऑपरेटिंग सिस्टम शेल उपयोगिताओं का उपयोग करके आसानी से फ़ाइलों की प्रतिलिपि बनाने के लिए अंतर्निहित कार्य प्रदान करता है।

फाइल को कॉपी करने के लिए निम्न कमांड का उपयोग किया जाता है

shutil.copy(src,dst)

मेटाडाटा सूचना के साथ फाइल को कॉपी करने के लिए निम्न कमांड का उपयोग किया जाता है

shutil.copystat(src,dst)

आपको फ़ाइल मेटाडेटा को संरक्षित करने के लिए copyतब चलना चाहिए copystat। पायथन 3.3+ में copystatभी विस्तारित विशेषताओं को कॉपी करता है।
ingyhere
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.