পাইথনে আমি কীভাবে একটি ফাইল অনুলিপি করব?


2472

পাইথনে আমি কীভাবে একটি ফাইল অনুলিপি করব?

আমি এর অধীনে কিছুই খুঁজে পেলাম না os


117
দেখে মনে হচ্ছে সিপি কোনও সিস্টেম কল নয় এবং সুতরাং ওএস মডিউলের সাথে সম্পর্কিত নয়। এটি একটি শেল কমান্ড, সুতরাং এটি shutil মডিউলতে রাখা হয়।
ওয়ালডোল 1

উত্তর:


3002

shutilআপনি ব্যবহার করতে পারেন অনেক পদ্ধতি আছে। যার মধ্যে একটি হ'ল:

from shutil import copyfile
copyfile(src, dst)
  • ফাইল নামে বিষয়বস্তু কপি src একটি ফাইল নামে DST
  • গন্তব্য অবস্থান অবশ্যই লিখনযোগ্য হতে হবে; অন্যথায়, একটি আইওআরর ব্যতিক্রম উত্থাপিত হবে।
  • তাহলে DST আগে থেকেই আছে, এটা প্রতিস্থাপন করা হবে।
  • অক্ষর বা ব্লক ডিভাইস এবং পাইপগুলির মতো বিশেষ ফাইলগুলি এই ফাংশনটির সাথে অনুলিপি করা যায় না।
  • সঙ্গে কপি , src এবং DST পথ হিসেবে দেওয়া নাম স্ট্রিং

আপনি ব্যবহার করেন তাহলে os.pathঅপারেশন, ব্যবহার copyবদলে copyfileকেবল স্ট্রিং গ্রহণcopyfile করবে ।


147
অনুলিপি এবং অনুলিপি মধ্যে পার্থক্য কি?
ম্যাট

385
অনুলিপি (src, dst) এ ডিএসটি ডিরেক্টরি হতে পারে।
ওপেন

41
মনে রাখবেন যে সমস্ত প্ল্যাটফর্ম আপনার প্ল্যাটফর্মের উপর নির্ভর করে অনুলিপি করা হবে না।
কেভিন হর্ন

12
মনে রাখবেন এটি কোনও পারমাণবিক অপারেশন নয়। থ্রেডযুক্ত অ্যাপ্লিকেশনটিতে এটি ব্যবহার করে যত্ন নিন।
ওয়াটারবাইট

4
নোট করুন যে এটি সংক্ষিপ্তসারগুলি যেমন পরিচালনা করতে পারে না ~তবে এটি আপেক্ষিক পাথগুলি মোকাবেলা করতে পারে
zwep

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       │
└──────────────────┴────────┴───────────┴───────┴────────────────┘

730

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/')(টার্গেটের পথের পরে স্ল্যাশ সহ) "দির" নামক একটি নতুন ফাইলে অনুলিপি করতে হবে বা ফাইলটিকে সেই নামের একটি ডিরেক্টরিতে রেখে দিতে হবে কিনা সে সম্পর্কে অস্পষ্টতা দূর করবে?
জাক

1
@ বিজয় আমি বিশ্বাস করি যে এই ওভারহেডটি মেটাডেটা অনুলিপি করার কারণে হয়েছে।
জোনাথন এইচ

/new/dir@ জাক যদি কোনও বিদ্যমান ডিরেক্টরি থাকে তবে কোনও দ্ব্যর্থ নেই @ দেখুন ম্যাথিউ অ্যালপার্টের মন্তব্য।
জোনাথন এইচ

@ জাক আপনি সঠিক, শেষের দিকে স্ল্যাশ যুক্ত করা অস্পষ্টতা দূর করে। যদি /new/dir/অস্তিত্ব না থাকে, পাইথন একটি নিক্ষেপ করবে IsADirectoryError, অন্যথায় এটি ফাইলটি /new/dir/মূল নামের অধীনে অনুলিপি করে ।
মার্টনবোগনার

125

আপনি shutilপ্যাকেজ থেকে অনুলিপি ফাংশনগুলির একটি ব্যবহার করতে পারেন :

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ফাংশন সংরক্ষণ করা অন্য অনুলিপি গ্রহণ সমর্থন করে
                      অনুমতি ডিরেক্টরি গন্তব্য। আপত্তি মেটাটাটা ফাইল  
-------------------------------------------------- ----------------------------
shutil.copy               ✔ ✔ ☐ ☐
 shutil.copy2              ✔ ✔ ☐ ✔
 shutil.copyfile           ☐ ☐ ☐ ☐
 shutil.copyfileobj        ☐ ☐ ✔ ☐
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━

উদাহরণ:

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

10
শুধু কৌতূহল, আপনি কীভাবে এই টেবিলটি তৈরি করেছিলেন?
হালকা চশমাবিদ

16
@ আলোকশেমিস্ট আমি সবেমাত্র স্ক্র্যাচপ্যাড হিসাবে ভিম ব্যবহার করেছি, উইকিপিডিয়া টেবিল থেকে ব্যবহৃত ইউনিকোড প্রতীকগুলি অনুলিপি করেছি এবং চূড়ান্ত পলিশিংয়ের জন্য ফলাফলটি স্ট্যাকওভারফ্লো সম্পাদকটিতে অনুলিপি করেছি।
maxschlepzig

3
এটি 2 বছর আগে অন্যান্য উত্তর থেকে কীভাবে আলাদা? stackoverflow.com/a/30359308/674039
উইম

1
@ উইম, আমার উত্তরটি আপনি উত্তরটির সাথে সংযুক্ত উত্তরটির 2017 সংস্করণের সাথে তুলনা করতে হবে যা আমি উত্তর পোস্ট করার সময় বর্তমান ছিল। প্রধান পার্থক্য: আমার উত্তরটি আরও ভাল / আরও বর্ণনামূলক কলাম শিরোনাম ব্যবহার করে, সারণী বিন্যাসটি বিভ্রান্তিকর নয়, এতে ডকুমেন্টের সরাসরি লিঙ্ক অন্তর্ভুক্ত রয়েছে এবং আমি একটি কলাম যুক্ত করেছি (অর্থাত 'ফাইলের আপত্তি গ্রহণ করি')।
ম্যাক্সচলেপজিগ

4
ঠিক আছে. ওয়াইএমএমভি, তবে আমি মনে করি প্রসাধনী পরিবর্তন এবং এর মতো ছোটখাটো উন্নতি উত্তরগুলির সদৃশ না হয়ে বিদ্যমান উত্তরের সম্পাদনা হিসাবে আরও ভাল করা হয়েছে।
উইম

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
আপনি শুটল অনুলিপি ফাংশনগুলির জন্য কেন এতগুলি খারাপ বিকল্প তালিকাভুক্ত করেন?
maxschlepzig

6
shutil অন্তর্নির্মিত, অ-বহনযোগ্য বিকল্প সরবরাহ করার প্রয়োজন নেই। সিস্টেম নির্ভর নির্ভর সমাধানগুলি সরিয়ে উত্তরটি আসলে উন্নত করা যেতে পারে এবং সেই অপসারণের পরে, এই উত্তরটি বিদ্যমান উত্তরগুলির একটি অনুলিপি / ডকুমেন্টেশনের অনুলিপি।
জাঁ ফ্রাসোয়া Fabre

3
os.popenকিছু সময়ের জন্য অবচয় করা হয়েছে। এবং check_outputস্ট্যাটাসটি ফিরিয়ে দেয় না তবে আউটপুট (যা ক্ষেত্রে খালি copy/cp)
জিন-ফ্রানসোইস ফ্যাব্রে

2
shutil আসলে ফাইল কপি করে না। আছে ডক্স শীর্ষে একটি বড় চর্বি সাবধানবাণী অধিকার । "এর অর্থ হ'ল ফাইলের মালিক এবং গোষ্ঠীগুলি এসিএলগুলির পাশাপাশি নষ্ট হয়ে গেছে Mac ফাইলের মালিক, এসিএল এবং বিকল্প ডেটা স্ট্রিমগুলি অনুলিপি করা হয়নি। "
gman

96

একটি ফাইল অনুলিপি করা অপেক্ষাকৃত সহজবোধ্য ক্রিয়া যা নীচের উদাহরণগুলির দ্বারা দেখানো হয়েছে, তবে আপনার পরিবর্তে তার জন্য shutil stdlib মডিউলটি ব্যবহার করা উচিত ।

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
আমি কিছুক্ষণ আগে লক্ষ্য করেছি যে মডিউলটিকে শুটিল (একবচন) বলা হয় এবং শুটিল (বহুবচন) বলা হয় না, এবং সত্যই এটি হয় না পাইথন ২.৩-এ রয়েছে। তবুও আমি উদাহরণ হিসাবে এখানে এই ফাংশন ছেড়ে।
পাই

4
একটি ফাইলের বিষয়বস্তু অনুলিপি করা করা একটি সরল ক্রিয়া operation ফাইলটিকে তার মেটাডেটা দিয়ে অনুলিপি করা সোজা ছাড়া কিছু নয়, এমনকি যদি আপনি ক্রস প্ল্যাটফর্ম হতে চান।
এলএসি

3
সত্য। শুটিল ডক্সের দিকে তাকানো, কপিফিল ফাংশনটি মেটাডেটাও অনুলিপি করবে না।
পাই

3
হ্যাঁ, আমি নিশ্চিত নই কেন আপনি কেবল উত্সটির অনুলিপি করবেন না shutil.copyfileobj। এছাড়াও, try, finallyব্যাতিক্রমের পরে ফাইলগুলি বন্ধ করতে আপনার কোনও দরকার নেই । তবে আমি বলব যে আপনার ফাংশনটি ফাইলগুলি খোলার এবং বন্ধ করার জন্য দায়বদ্ধ হওয়া উচিত নয়। এটি একটি মোড়ক ফাংশনে যেতে হবে, যেমন shutil.copyfileমোড়ানো হয় shutil.copyfileobj
এরলভোল্টন

2
উপরের কোডটি destopen(dest, 'wb')
লেখার যোগ্য

69

Shutil মডিউল ব্যবহার করুন ।

copyfile(src, dst)

Src নামের ফাইলটির বিষয়বস্তু dst নামক একটি ফাইলে অনুলিপি করুন। গন্তব্য অবস্থান অবশ্যই লিখনযোগ্য হতে হবে; অন্যথায়, একটি আইওআরর ব্যতিক্রম উত্থাপিত হবে। ডিস্ট ইতিমধ্যে উপস্থিত থাকলে, এটি প্রতিস্থাপন করা হবে। অক্ষর বা ব্লক ডিভাইস এবং পাইপগুলির মতো বিশেষ ফাইলগুলি এই ফাংশনটির সাথে অনুলিপি করা যায় না। src এবং dst স্ট্রিং হিসাবে দেওয়া পথের নাম।

একবার দেখুন স্ট্যান্ডার্ড পাইথন মডিউলগুলিতে উপলব্ধ সমস্ত ফাইল এবং ডিরেক্টরি হ্যান্ডলিং ফাংশনগুলির জন্য ফাইলসগুলি


shutil আসলে ফাইল কপি করে না। আছে ডক্স শীর্ষে একটি বড় চর্বি সাবধানবাণী অধিকার । "এর অর্থ হ'ল ফাইলের মালিক এবং গোষ্ঠীগুলি এসিএলগুলির পাশাপাশি নষ্ট হয়ে গেছে Mac ফাইলের মালিক, এসিএল এবং বিকল্প ডেটা স্ট্রিমগুলি অনুলিপি করা হয়নি। "
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()

গন্তব্য ডিরেক্টরিটি ফিরে আসার সাথে সাথে এসআরসি-র মূলযুক্ত একটি সম্পূর্ণ ডিরেক্টরি ট্রি অনুলিপি করে অনুলিপি করুন


1
shutil আসলে ফাইল কপি করে না। আছে ডক্স শীর্ষে একটি বড় চর্বি সাবধানবাণী অধিকার । "এর অর্থ হ'ল ফাইলের মালিক এবং গোষ্ঠীগুলি এসিএলগুলির পাশাপাশি নষ্ট হয়ে গেছে Mac ফাইলের মালিক, এসিএল এবং বিকল্প ডেটা স্ট্রিমগুলি অনুলিপি করা হয়নি। "
gman

19

ছোট ফাইলগুলির জন্য এবং কেবল পাইথন বিল্ট-ইনগুলি ব্যবহার করার জন্য, আপনি নিম্নলিখিত ওয়ান-লাইনার ব্যবহার করতে পারেন:

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

যেমন @ ম্যাক্সচলেপজিগ নীচের মন্তব্যে উল্লিখিত হয়েছে, ফাইলগুলি খুব বেশি বা মেমরির সমালোচনামূলক হয় এমন অ্যাপ্লিকেশনগুলির জন্য এটি সর্বোত্তম উপায় নয়, সুতরাং স্বতির উত্তর পছন্দ করা উচিত।


3
এটি সম্পূর্ণ উত্স ফাইলটি আবার লেখার আগে মেমোরিতে পড়ে। সুতরাং, এটি অকারণে ছোট ফাইল ফাইল অনুলিপি অপারেশন ব্যতীত সকলের জন্য মেমরি নষ্ট করে।
maxschlepzig

1
এটা কি সত্যি? আমি মনে করি .read()এবং .write()ডিফল্ট হিসাবে বাফার হয় (কমপক্ষে সিপথনের জন্য)।
সাউন্ডস্ট্রাইপ

@ সাউন্ডস্ট্রাইপ, অবশ্যই এটি সত্য। এই ফাইলটি প্রত্যাবর্তন করে open()আইও বাফার করে দেয় এটি ডিফল্টরূপে আপনাকে এখানে সহায়তা করে না, কারণ read()এটি নির্দিষ্ট করা আছে: 'এন যদি নেতিবাচক বা বাদ দেওয়া হয় তবে ইওএফ অবধি পড়ুন' ' তার মানে হল যে 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
শুটিল আরও বহনযোগ্য
হায়াদোর

1
subprocess.run()@ ম্যাক্সচলেপজিগের পরামর্শ অনুসারে বাহ্যিক প্রোগ্রামগুলি কল করার সময় একটি বড় পদক্ষেপ। নমনীয়তা এবং সুরক্ষার জন্য, ['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, সরল ব্লক রিড / রাইটিং লুপ (আনবুফার্ড আইও ব্যবহার করে) সরাসরি এগিয়ে থাকে, দক্ষ হবে এবং এর থেকে অনেক বেশি অর্থবোধ তৈরি করবে এবং এভাবে শেখানো এবং বোঝা অবশ্যই সহজ।
ম্যাক্সচলেপজিগ

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

10
এটি প্ল্যাটফর্মের উপর নির্ভর করে, তাই আমি ব্যবহার করব না।
কেভিন মেয়ার

5
যেমন একটি callঅনিরাপদ। এটি সম্পর্কে সাবপ্রসেস ডকুমেন্ট দেখুন।
বুটজ

2
এটি পোর্টেবল নয় এবং অপ্রয়োজনীয় যেহেতু আপনি কেবল শটিল ব্যবহার করতে পারেন।
কোরি গোল্ডবার্গ

2
হুম কেন পাইথন, তাহলে?
বারিস ডেমিরে

সম্ভবত শুরুর আগে অপারেটিং সিস্টেমটি সনাক্ত করুন (এটি ডস বা ইউনিক্স কিনা, কারণ এটি দুটিই সবচেয়ে বেশি ব্যবহৃত হয়)
মিলকিওয়াই 90

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(...)গুলি?
ভাগ্যোডোনাল্ড

.ক্লোজ () এর কোনও প্রয়োজন নেই, যেহেতু আমরা কোথাও ফাইল পয়েন্টার অবজেক্টটি স্টোরিং করছি না (এসসিআর ফাইলের জন্য বা গন্তব্য ফাইলের জন্য নয়)।
এস 471

1
হলুদ 0 জবাব হিসাবে একই suboptimal মেমরি-নষ্ট পদ্ধতির ।
ম্যাক্সচলেপজিগ

-3

অপারেটিং সিস্টেম শেল ইউটিলিটিগুলি ব্যবহার করে ফাইলগুলি অনুলিপি করার জন্য পাইথন ইন-বিল্ট ফাংশন সরবরাহ করে।

নিম্নলিখিত কমান্ডটি ফাইল অনুলিপি করতে ব্যবহৃত হয়

shutil.copy(src,dst)

মেটাডেটা তথ্য সহ ফাইল অনুলিপি করতে নিম্নলিখিত কমান্ডটি ব্যবহার করা হয়

shutil.copystat(src,dst)

ফাইল মেটাটাটা সংরক্ষণের জন্য আপনার copyতখন চালানো উচিত copystat। পাইথন ৩.৩++ copystatএ বর্ধিত বৈশিষ্ট্যও অনুলিপি করে।
in
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.