Yanıtlar:
shutil
kullanabileceğiniz birçok yöntem vardır. Bunlardan biri:
from shutil import copyfile
copyfile(src, dst)
Eğer kullanırsanız os.path
operasyonları kullanmak copy
yerine copyfile
. copyfile
olacak sadece dizeleri kabul .
~
┌──────────────────┬────────┬───────────┬───────┬────────────────┐
│ 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)
genellikle aşağıdakilerden daha yararlıdır copyfile(src,dst)
:
dst
bir olmak dizini (yerine tamamen hedef dosya), ki bu durumda basename arasında src
yeni bir dosya oluşturmak için kullanılır;Kısa bir örnek:
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
oldukça hızlıcopy2
shutil.copy2('/dir/file.ext', '/new/dir/')
(hedef yoldan sonra eğik çizgi ile) "dir" adlı yeni bir dosyaya kopyalamak veya dosyayı bu adın bir dizinine koymak için belirsizliği kaldıracağını varsayalım mı?
/new/dir
Varolan bir dizin varsa belirsizlik yoktur , bkz. @ MatthewAlpert'in yorumu.
/new/dir/
yoksa, Python bir atacağım IsADirectoryError
için, aksi takdirde kopyalar dosyasını /new/dir/
orijinal adı altında.
shutil
Paketteki kopyalama işlevlerinden birini kullanabilirsiniz :
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ İşlev korur destekler diğer kopyaları kabul eder izinler dizini dosya objesi meta verileri -------------------------------------------------- ---------------------------- shutil.copy ✔ ✔ ☐ ☐ shutil.copy2 ✔ ✔ ☐ ✔ shutil.copyfile ☐ ☐ ☐ ☐ Instagram Hesabındaki Resim ve Videoları shutil.copyfileobj ☐ ☐ ✔ ☐ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Misal:
import shutil
shutil.copy('/etc/hostname', '/var/tmp/testhostname')
Python'da dosyaları kullanarak kopyalayabilirsiniz.
shutil
modülos
modülsubprocess
modülimport os
import shutil
import subprocess
shutil
Modül kullanarak dosya kopyalamashutil.copyfile
imza
shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copyfile('source.txt', 'destination.txt')
shutil.copy
imza
shutil.copy(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copy('source.txt', 'destination.txt')
shutil.copy2
imza
shutil.copy2(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copy2('source.txt', 'destination.txt')
shutil.copyfileobj
imza
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
Modül kullanarak dosya kopyalamaos.popen
imza
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
imza
os.system(command)
# In Linux/Unix
os.system('cp source.txt destination.txt')
# In Windows
os.system('copy source.txt destination.txt')
subprocess
Modül kullanarak dosya kopyalamasubprocess.call
imza
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(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]
, özellikle parametreler kullanıcı girdisindeyse, mümkün olan her yerde sözdizimi kullanın .
os.popen
bir süredir kullanımdan kaldırıldı. ve check_output
durumu döndürmez ancak çıktı (bu durumda boştur copy/cp
)
Bir dosyayı kopyalamak, aşağıdaki örneklerde gösterildiği gibi nispeten basit bir işlemdir, ancak bunun için shutil stdlib modülünü kullanmalısınız .
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)
Dosya adına göre kopyalamak isterseniz, böyle bir şey yapabilirsiniz:
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
. Ayrıca, try, finally
istisnalardan sonra dosyaları kapatmak için herhangi bir işleminiz yoktur. Bununla birlikte, işlevinizin dosyaları hiç açıp kapatmaktan sorumlu olmaması gerektiğini söyleyebilirim. Bu, nasıl shutil.copyfile
sarıldığı gibi bir sarıcı işlevine girmelidir shutil.copyfileobj
.
dest
yazılabilir olarak belirtilmelidir:open(dest, 'wb')
Kapama modülünü kullanın .
copyfile(src, dst)
Src adlı dosyanın içeriğini dst adlı bir dosyaya kopyalayın. Hedef konum yazılabilir olmalıdır; aksi takdirde, bir IOError istisnası ortaya çıkar. Dst zaten varsa, değiştirilecektir. Karakter veya blok aygıtları ve yöneltmeler gibi özel dosyalar bu işlevle kopyalanamaz. src ve dst, dize olarak verilen yol adlarıdır.
Bir göz atın filesys standart Python modülleri bulunan tüm dosya ve dizin taşıma işlevleri için.
Dizin ve Dosya kopyalama örneği - Tim Golden's Python Stuff'dan:
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"
İlk olarak, referansınız için kapsamlı bir hile sayfası hilesi yaptım.
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',]
}
İkinci olarak, örneklerde kopya yöntemlerini açıklayın:
shutil.copyfileobj(fsrc, fdst[, length])
açılmış nesneleri manipüle etme
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)
Kopyalama ve yeniden adlandırma
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()
Meta verileri saklamadan kopyalama
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()
Meta verileri koruyarak kopyalama
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()
Hedef dizini döndürerek src'de köklenen tüm dizin ağacını yinelemeli olarak kopyalayın
Küçük dosyalar ve yalnızca python yerleşiklerini kullanmak için aşağıdaki tek astarı kullanabilirsiniz:
with open(source, 'rb') as src, open(dest, 'wb') as dst: dst.write(src.read())
@Maxschlepzig Aşağıdaki yorum belirtildiği gibi, bu dosya çok büyük veya bellek kritik olduğunda, böylece uygulamalar için en uygun yol değildir Swati cevabı tercih edilmelidir.
.read()
ve .write()
varsayılan olarak arabelleğe alındı (en azından CPython için).
open()
varsayılan olarak IO arabelleğe alması, burada size yardımcı olmaz, çünkü read()
'n negatif veya atlanmışsa, EOF'a kadar okuyun.' Bu read()
, tüm dosya içeriğini dize olarak döndüreceği anlamına gelir .
Kullanabilirsin os.system('cp nameoffilegeneratedbyprogram /otherdirectory/')
ya da yaptığım gibi,
os.system('cp '+ rawfile + ' rawdata.dat')
nerede rawfile
ben programı içinde oluşturulan ettiğini adıdır.
Bu yalnızca Linux için bir çözümdür
shutil
Mevcut olmadığında bile - subprocess.run()
(olmadan shell=True
!) Daha iyi bir alternatiftir os.system()
.
subprocess.run()
@maxschlepzig tarafından önerildiği gibi, harici programları çağırırken ileriye doğru büyük bir adımdır. Ancak esneklik ve güvenlik ['cp', rawfile, 'rawdata.dat']
için komut satırını geçirme biçimini kullanın . (Ancak, kopyalama için shutil
ve harici bir programı çağırmak için arkadaşlara tavsiye edilir.)
Büyük dosyalar için yaptığım şey dosyayı satır satır okumak ve her satırı bir diziye okumaktı. Ardından, dizi belirli bir boyuta ulaştığında, diziyi yeni bir dosyaya ekleyin.
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)
iş bulmak gerekir; sadece çıkış akışı tamponunu ihtiyaçlarınıza göre ayarlayın. veya bir seferde yazmak istediğiniz bayt sayısının output.write(read(n)); output.flush()
nerede n
olduğu ile bir denemede döngü yaparak baytların üstesinden gelebilirsiniz . her ikisinin de hangi bonus olduğunu kontrol etmek için bir koşulu yoktur.
shutil
? Görmezden gelse bile shutil
, basit bir blok okuma / yazma döngüsü (arabelleksiz IO kullanarak) doğrudan ileri, verimli ve bundan daha mantıklı olacaktır ve bu nedenle öğretilmesi ve anlaşılması kesinlikle daha kolaydır.
from subprocess import call
call("cp -p <file> <file>", shell=True)
call
güvenli değil. Lütfen bu konuda alt süreçlere başvurunuz.
İtibariyle Python 3.5 (: metin dosyaları, küçük jpegler yani) küçük dosyalar için aşağıdakileri yapabilirsiniz:
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
hedefin bulunduğu yerin üzerine yazacak
shutil
.
open(destination, 'wb').write(open(source, 'rb').read())
Kaynak dosyayı okuma modunda açın ve hedef dosyaya yazma modunda yazın.
.close()
Bunların hepsinde eksik değil open(...)
mi?
Python, İşletim Sistemi Kabuğu yardımcı programlarını kullanarak dosyaları kolayca kopyalamak için yerleşik işlevler sağlar.
Dosyayı Kopyalamak için aşağıdaki komut kullanılır
shutil.copy(src,dst)
MetaData Bilgileri ile Dosya Kopyalamak için aşağıdaki komut kullanılır
shutil.copystat(src,dst)
copy
daha sonra çalıştırmalısınız copystat
. Python 3.3+ sürümünde copystat
genişletilmiş öznitelikleri de kopyalar.