পাইথনে আমি কীভাবে একটি ফাইল অনুলিপি করব?
আমি এর অধীনে কিছুই খুঁজে পেলাম না os
।
পাইথনে আমি কীভাবে একটি ফাইল অনুলিপি করব?
আমি এর অধীনে কিছুই খুঁজে পেলাম না os
।
উত্তর:
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/')
(টার্গেটের পথের পরে স্ল্যাশ সহ) "দির" নামক একটি নতুন ফাইলে অনুলিপি করতে হবে বা ফাইলটিকে সেই নামের একটি ডিরেক্টরিতে রেখে দিতে হবে কিনা সে সম্পর্কে অস্পষ্টতা দূর করবে?
/new/dir
@ জাক যদি কোনও বিদ্যমান ডিরেক্টরি থাকে তবে কোনও দ্ব্যর্থ নেই @ দেখুন ম্যাথিউ অ্যালপার্টের মন্তব্য।
/new/dir/
অস্তিত্ব না থাকে, পাইথন একটি নিক্ষেপ করবে IsADirectoryError
, অন্যথায় এটি ফাইলটি /new/dir/
মূল নামের অধীনে অনুলিপি করে ।
আপনি shutil
প্যাকেজ থেকে অনুলিপি ফাংশনগুলির একটি ব্যবহার করতে পারেন :
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ফাংশন সংরক্ষণ করা অন্য অনুলিপি গ্রহণ সমর্থন করে অনুমতি ডিরেক্টরি গন্তব্য। আপত্তি মেটাটাটা ফাইল -------------------------------------------------- ---------------------------- 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
)
একটি ফাইল অনুলিপি করা অপেক্ষাকৃত সহজবোধ্য ক্রিয়া যা নীচের উদাহরণগুলির দ্বারা দেখানো হয়েছে, তবে আপনার পরিবর্তে তার জন্য 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)
shutil.copyfileobj
। এছাড়াও, try, finally
ব্যাতিক্রমের পরে ফাইলগুলি বন্ধ করতে আপনার কোনও দরকার নেই । তবে আমি বলব যে আপনার ফাংশনটি ফাইলগুলি খোলার এবং বন্ধ করার জন্য দায়বদ্ধ হওয়া উচিত নয়। এটি একটি মোড়ক ফাংশনে যেতে হবে, যেমন shutil.copyfile
মোড়ানো হয় shutil.copyfileobj
।
dest
open(dest, 'wb')
Shutil মডিউল ব্যবহার করুন ।
copyfile(src, dst)
Src নামের ফাইলটির বিষয়বস্তু dst নামক একটি ফাইলে অনুলিপি করুন। গন্তব্য অবস্থান অবশ্যই লিখনযোগ্য হতে হবে; অন্যথায়, একটি আইওআরর ব্যতিক্রম উত্থাপিত হবে। ডিস্ট ইতিমধ্যে উপস্থিত থাকলে, এটি প্রতিস্থাপন করা হবে। অক্ষর বা ব্লক ডিভাইস এবং পাইপগুলির মতো বিশেষ ফাইলগুলি এই ফাংশনটির সাথে অনুলিপি করা যায় না। src এবং dst স্ট্রিং হিসাবে দেওয়া পথের নাম।
একবার দেখুন স্ট্যান্ডার্ড পাইথন মডিউলগুলিতে উপলব্ধ সমস্ত ফাইল এবং ডিরেক্টরি হ্যান্ডলিং ফাংশনগুলির জন্য ফাইলসগুলি ।
ডিরেক্টরি এবং ফাইলের অনুলিপি উদাহরণ - টিম গোল্ডেনের পাইথন স্টাফ থেকে:
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()
গন্তব্য ডিরেক্টরিটি ফিরে আসার সাথে সাথে এসআরসি-র মূলযুক্ত একটি সম্পূর্ণ ডিরেক্টরি ট্রি অনুলিপি করে অনুলিপি করুন
ছোট ফাইলগুলির জন্য এবং কেবল পাইথন বিল্ট-ইনগুলি ব্যবহার করার জন্য, আপনি নিম্নলিখিত ওয়ান-লাইনার ব্যবহার করতে পারেন:
with open(source, 'rb') as src, open(dest, 'wb') as dst: dst.write(src.read())
যেমন @ ম্যাক্সচলেপজিগ নীচের মন্তব্যে উল্লিখিত হয়েছে, ফাইলগুলি খুব বেশি বা মেমরির সমালোচনামূলক হয় এমন অ্যাপ্লিকেশনগুলির জন্য এটি সর্বোত্তম উপায় নয়, সুতরাং স্বতির উত্তর পছন্দ করা উচিত।
.read()
এবং .write()
ডিফল্ট হিসাবে বাফার হয় (কমপক্ষে সিপথনের জন্য)।
open()
আইও বাফার করে দেয় এটি ডিফল্টরূপে আপনাকে এখানে সহায়তা করে না, কারণ read()
এটি নির্দিষ্ট করা আছে: 'এন যদি নেতিবাচক বা বাদ দেওয়া হয় তবে ইওএফ অবধি পড়ুন' ' তার মানে হল যে read()
স্ট্রিং হিসাবে সম্পূর্ণ ফাইল সামগ্রীটি ফেরত দেয়।
আপনি ব্যবহার করতে পারেন os.system('cp nameoffilegeneratedbyprogram /otherdirectory/')
বা যেমন আমি এটি করেছি,
os.system('cp '+ rawfile + ' rawdata.dat')
rawfile
প্রোগ্রামটির ভিতরে আমি যে নামটি তৈরি করেছি তা কোথায় ।
এটি লিনাক্সের একমাত্র সমাধান
shutil
উপলব্ধ না হয় - subprocess.run()
(ছাড়া shell=True
!) এর চেয়ে ভাল বিকল্প os.system()
।
subprocess.run()
@ ম্যাক্সচলেপজিগের পরামর্শ অনুসারে বাহ্যিক প্রোগ্রামগুলি কল করার সময় একটি বড় পদক্ষেপ। নমনীয়তা এবং সুরক্ষার জন্য, ['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
, সরল ব্লক রিড / রাইটিং লুপ (আনবুফার্ড আইও ব্যবহার করে) সরাসরি এগিয়ে থাকে, দক্ষ হবে এবং এর থেকে অনেক বেশি অর্থবোধ তৈরি করবে এবং এভাবে শেখানো এবং বোঝা অবশ্যই সহজ।
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
। পাইথন ৩.৩++ copystat
এ বর্ধিত বৈশিষ্ট্যও অনুলিপি করে।