Jawaban:
shutil
memiliki banyak metode yang dapat Anda gunakan. Salah satunya adalah:
from shutil import copyfile
copyfile(src, dst)
Jika Anda menggunakan os.path
operasi, gunakan copy
daripada copyfile
. hanyacopyfile
akan menerima string .
~
, tetapi dapat menangani jalur relatif
┌──────────────────┬────────┬───────────┬───────┬────────────────┐
│ 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)
seringkali lebih bermanfaat daripada copyfile(src,dst)
karena:
dst
untuk menjadi direktori (bukan nama file target lengkap), dalam hal ini nama dasar dari src
digunakan untuk membuat file baru;Ini adalah contoh singkat:
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
jauh lebih cepat daripadacopy2
shutil.copy2('/dir/file.ext', '/new/dir/')
(dengan garis miring setelah jalur target) akan menghapus ambiguitas mengenai apakah akan menyalin ke file baru yang disebut "dir" atau untuk memasukkan file ke direktori nama itu?
/new/dir
ada direktori yang ada, lihat komentar @ MatthewAlpert.
/new/dir/
tidak ada, Python akan melempar IsADirectoryError
, jika tidak, menyalin file ke /new/dir/
bawah nama asli.
Anda dapat menggunakan salah satu fungsi salin dari shutil
paket:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Fungsi mempertahankan mendukung menerima salinan lainnya direktori hak akses. mengajukan keberatan metadata ―――――――――――――――――――――――――――――――――――――――――――――――――― ―――――――――――――――――――――――――――― shutil.copy ✔ ✔ ☐ ☐ shutil.copy2 ✔ ✔ ☐ ✔ shutil.copyfile ☐ ☐ ☐ ☐ shutil.copyfileobj ☐ ☐ ✔ ☐ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Contoh:
import shutil
shutil.copy('/etc/hostname', '/var/tmp/testhostname')
Dengan Python, Anda dapat menyalin file menggunakan
shutil
modulos
modulsubprocess
modulimport os
import shutil
import subprocess
shutil
modulshutil.copyfile
tanda tangan
shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copyfile('source.txt', 'destination.txt')
shutil.copy
tanda tangan
shutil.copy(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copy('source.txt', 'destination.txt')
shutil.copy2
tanda tangan
shutil.copy2(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copy2('source.txt', 'destination.txt')
shutil.copyfileobj
tanda tangan
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
modulos.popen
tanda tangan
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
tanda tangan
os.system(command)
# In Linux/Unix
os.system('cp source.txt destination.txt')
# In Windows
os.system('copy source.txt destination.txt')
subprocess
modulsubprocess.call
tanda tangan
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
tanda tangan
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]
sintaksis sedapat mungkin, terutama jika parameternya dari input pengguna.
os.popen
sudah ditinggalkan untuk sementara waktu sekarang. dan check_output
tidak mengembalikan status tetapi output (yang kosong dalam kasus copy/cp
)
Menyalin file adalah operasi yang relatif mudah seperti yang ditunjukkan oleh contoh di bawah ini, tetapi Anda sebaiknya menggunakan modul shutil stdlib untuk itu.
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)
Jika Anda ingin menyalin dengan nama file Anda bisa melakukan sesuatu seperti ini:
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
. Selain itu, Anda tidak perlu try, finally
menangani penutupan file setelah pengecualian. Saya akan mengatakan, bahwa fungsi Anda seharusnya tidak bertanggung jawab untuk membuka dan menutup file sama sekali. Itu harus masuk dalam fungsi pembungkus, seperti bagaimana shutil.copyfile
membungkus shutil.copyfileobj
.
dest
dapat ditulisi:open(dest, 'wb')
Gunakan modul shutil .
copyfile(src, dst)
Salin konten file bernama src ke file bernama dst. Lokasi tujuan harus dapat ditulis; jika tidak, pengecualian IOError akan dimunculkan. Jika dst sudah ada, itu akan diganti. File khusus seperti karakter atau perangkat blok dan pipa tidak dapat disalin dengan fungsi ini. src dan dst adalah nama path yang diberikan sebagai string.
Lihatlah filesys untuk semua fungsi penanganan file dan direktori yang tersedia dalam modul Python standar.
Contoh Direktori dan Salin File - Dari Barang Python Tim Golden:
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"
Pertama, saya membuat cheatsheet lengkap tentang metode shutil untuk referensi Anda.
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',]
}
Kedua, jelaskan metode penyalinan dalam exmaples:
shutil.copyfileobj(fsrc, fdst[, length])
memanipulasi objek yang terbuka
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)
Salin dan ganti nama
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()
Salin tanpa membuat metadata
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()
Salin dengan praduga metadata
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()
Secara rekursif menyalin seluruh pohon direktori yang di-root di src, mengembalikan direktori tujuan
Untuk file kecil dan hanya menggunakan built-in python, Anda dapat menggunakan one-liner berikut:
with open(source, 'rb') as src, open(dest, 'wb') as dst: dst.write(src.read())
Seperti @maxschlepzig disebutkan dalam komentar di bawah, ini bukan cara yang optimal untuk aplikasi di mana file terlalu besar atau ketika memori kritis, sehingga jawaban Swati harus lebih disukai.
.read()
dan .write()
buffered secara default (setidaknya untuk CPython).
open()
buffer IO, secara default tidak membantu Anda di sini, karena read()
ditentukan sebagai: 'Jika n negatif atau dihilangkan, baca sampai EOF.' Itu berarti read()
mengembalikan konten file lengkap sebagai string.
Anda bisa menggunakannya os.system('cp nameoffilegeneratedbyprogram /otherdirectory/')
atau seperti yang saya lakukan,
os.system('cp '+ rawfile + ' rawdata.dat')
di mana rawfile
nama yang saya buat di dalam program.
Ini adalah solusi hanya Linux
shutil
tidak tersedia - subprocess.run()
(tanpa shell=True
!) Adalah alternatif yang lebih baik os.system()
.
subprocess.run()
seperti yang disarankan oleh @maxschlepzig adalah langkah besar ke depan, saat memanggil program eksternal. Namun untuk fleksibilitas dan keamanan, gunakan ['cp', rawfile, 'rawdata.dat']
bentuk melewati baris perintah. (Namun, untuk menyalin, shutil
dan teman-teman disarankan untuk tidak memanggil program eksternal.)
Untuk file besar, yang saya lakukan adalah membaca file baris demi baris dan membaca setiap baris menjadi sebuah array. Kemudian, setelah array mencapai ukuran tertentu, tambahkan ke file baru.
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)
harus bekerja temukan; hanya mengatur buffer aliran output sesuai kebutuhan Anda. atau Anda dapat pergi dengan byte dengan mengulangi coba dengan di output.write(read(n)); output.flush()
mana n
jumlah byte yang ingin Anda tulis sekaligus. keduanya juga tidak memiliki syarat untuk memeriksa mana yang merupakan bonus.
shutil
? Bahkan ketika mengabaikan shutil
, loop blok baca / tulis sederhana (menggunakan IO unbuffered) langsung, akan efisien dan akan jauh lebih masuk akal daripada ini, dan dengan demikian tentu lebih mudah untuk diajarkan dan dipahami.
from subprocess import call
call("cp -p <file> <file>", shell=True)
call
itu tidak aman. Silakan merujuk pada dokumen subproses tentang hal itu.
Pada Python 3.5 Anda dapat melakukan hal berikut untuk file kecil (yaitu: file teks, jpeg kecil):
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
akan menimpa apa pun yang ada di lokasi tujuan
shutil
menangani semua kasus khusus untuk Anda dan memberi Anda ketenangan pikiran.
open(destination, 'wb').write(open(source, 'rb').read())
Buka file sumber dalam mode baca, dan tulis ke file tujuan dalam mode tulis.
.close()
semua open(...)
itu?
Python menyediakan fungsi bawaan untuk menyalin file dengan mudah menggunakan utilitas Shell Sistem Pengoperasian.
Perintah berikut digunakan untuk menyalin file
shutil.copy(src,dst)
Perintah berikut digunakan untuk menyalin file dengan informasi MetaData
shutil.copystat(src,dst)
copy
kemudian copystat
untuk melestarikan file metadata. Dalam Python 3.3+ copystat
juga menyalin atribut yang diperluas.