Yanıtlar:
shutilkullanabileceğiniz birçok yöntem vardır. Bunlardan biri:
from shutil import copyfile
copyfile(src, dst)
Eğer kullanırsanız os.pathoperasyonları kullanmak copyyerine copyfile. copyfileolacak 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):
dstbir olmak dizini (yerine tamamen hedef dosya), ki bu durumda basename arasında srcyeni 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
copyfileoldukç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/dirVarolan bir dizin varsa belirsizlik yoktur , bkz. @ MatthewAlpert'in yorumu.
/new/dir/yoksa, Python bir atacağım IsADirectoryErroriçin, aksi takdirde kopyalar dosyasını /new/dir/orijinal adı altında.
shutilPaketteki 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
shutilModü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)
osModü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')
subprocessModü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.popenbir süredir kullanımdan kaldırıldı. ve check_outputdurumu 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, finallyistisnalardan 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.copyfilesarıldığı gibi bir sarıcı işlevine girmelidir shutil.copyfileobj.
destyazı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 rawfileben programı içinde oluşturulan ettiğini adıdır.
Bu yalnızca Linux için bir çözümdür
shutilMevcut 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 shutilve 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 nolduğ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)
callgü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)
copydaha sonra çalıştırmalısınız copystat. Python 3.3+ sürümünde copystatgenişletilmiş öznitelikleri de kopyalar.