Làm cách nào để sao chép tệp trong Python?


2478

Làm cách nào để sao chép tệp trong Python?

Tôi không thể tìm thấy bất cứ điều gì dưới os.


117
Có vẻ như cp không phải là một cuộc gọi hệ thống và do đó không thuộc về mô-đun os. Nó là một lệnh shell, vì vậy nó được đặt trong mô-đun tắt.
waldol1

Câu trả lời:


3010

shutilcó nhiều phương pháp bạn có thể sử dụng. Một trong số đó là:

from shutil import copyfile
copyfile(src, dst)
  • Sao chép nội dung của tệp có tên src vào một tệp có tên dst .
  • Vị trí đích phải có thể ghi được; nếu không, một ngoại lệ IOError sẽ được đưa ra.
  • Nếu dst đã tồn tại, nó sẽ được thay thế.
  • Các tập tin đặc biệt như ký tự hoặc thiết bị khối và đường ống không thể được sao chép với chức năng này.
  • Với bản sao , srcdst là tên đường dẫn được cung cấp dưới dạng chuỗi .

Nếu bạn sử dụng các os.pathhoạt động, sử dụng copychứ không phải copyfile. copyfilesẽ chỉ chấp nhận chuỗi .


147
Sự khác biệt giữa copy và copyfile là gì?
Matt

386
trong bản sao (src, dst), dst có thể là một thư mục.
Owen

41
Lưu ý rằng không phải tất cả siêu dữ liệu sẽ được sao chép, tùy thuộc vào nền tảng của bạn.
Kevin Horn

12
Lưu ý rằng nó không phải là một hoạt động nguyên tử. Hãy cẩn thận bằng cách sử dụng nó trong một ứng dụng luồng.
waterbyte

4
Lưu ý rằng nó không thể xử lý các chữ viết tắt như thế ~, nhưng nó có thể xử lý các đường dẫn tương đối
zwep 27/11/18

1252
┌──────────────────┬────────┬───────────┬───────┬────────────────┐
│     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       │
└──────────────────┴────────┴───────────┴───────┴────────────────┘

732

copy2(src,dst)thường hữu ích hơn copyfile(src,dst)vì:

  • nó cho phép dstlà một thư mục (thay vì tên tệp đích hoàn chỉnh), trong trường hợp đó, tên cơ sở của srcđược sử dụng để tạo tệp mới;
  • nó bảo tồn thông tin sửa đổi và truy cập ban đầu (mtime và atime) trong siêu dữ liệu tệp (tuy nhiên, điều này đi kèm với một chi phí nhỏ).

Đây là một ví dụ ngắn:

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
Tôi đang cố gắng sao chép ngẫu nhiên 100k tệp từ 1 triệu tệp. copyfilenhanh hơn đáng kể so vớicopy2
Vijay

4
Tôi có đúng không khi cho rằng shutil.copy2('/dir/file.ext', '/new/dir/')(với dấu gạch chéo sau đường dẫn đích) sẽ loại bỏ sự mơ hồ về việc sao chép vào một tệp mới có tên là "dir" hay để đặt tệp vào một thư mục có tên đó?
Zak

1
@Vijay Tôi tin rằng chi phí này là do sao chép siêu dữ liệu.
Jonathan H

@Zak Không có sự mơ hồ nếu /new/dirlà một thư mục hiện có, xem bình luận của @ MatthewAlpert.
Jonathan H

@Zak Bạn đã đúng, thêm một dấu gạch chéo vào cuối sẽ loại bỏ sự mơ hồ. Nếu /new/dir/không tồn tại, Python sẽ ném một IsADirectoryErrortệp, nếu không nó sẽ sao chép tệp vào /new/dir/dưới tên gốc.
martonbognar

125

Bạn có thể sử dụng một trong các chức năng sao chép từ shutilgói:

Ăn miếng thịt ăn miếng thịt miếng, miếng thịt, miếng thịt Ăn vặt ăn thịt
Chức năng bảo quản hỗ trợ chấp nhận các bản sao khác
                      thư mục quyền mệnh. tập tin siêu dữ liệu obj  
-------------------------------------------------- ----------------------------
shutil.copy               ✔ ✔ ☐ ☐
 shutil.copy2              ✔ ✔ ☐ ✔
 shutil.copyfile           ☐ ☐ ☐
 shutil.copyfileobj        ☐ ✔
Ăn miếng thịt ăn miếng thịt miếng, miếng thịt, miếng thịt Ăn vặt ăn thịt

Thí dụ:

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

10
Chỉ tò mò, làm thế nào bạn tạo ra bảng đó?
hóa học ánh sáng

16
@lightalchemist Tôi chỉ sử dụng vim như một bàn di chuột, sao chép các ký hiệu unicode đã sử dụng từ bảng wikipedia và sao chép kết quả vào trình soạn thảo stackoverflow để đánh bóng lần cuối.
maxschlepzig

3
Điều này khác với câu trả lời khác 2 năm trước như thế nào? stackoverflow.com/a/30359308/674039
wim

1
@wim, bạn phải so sánh câu trả lời của tôi với phiên bản 2017 của câu trả lời bạn đã liên kết hiện có khi tôi đăng câu trả lời của mình. Sự khác biệt chính: câu trả lời của tôi sử dụng các tiêu đề cột mô tả tốt hơn / tốt hơn, bố cục bảng không gây mất tập trung, nó bao gồm các liên kết trực tiếp vào thông tin và tôi đã thêm một cột (tức là 'chấp nhận tệp obj').
maxschlepzig

4
ĐỒNG Ý. YMMV, nhưng tôi nghĩ những thay đổi thẩm mỹ và những cải tiến nhỏ như thế được thực hiện tốt hơn khi chỉnh sửa các câu trả lời hiện có, thay vì trùng lặp các câu trả lời.
wim

104

Trong Python, bạn có thể sao chép các tệp bằng cách sử dụng


import os
import shutil
import subprocess

1) Sao chép tập tin bằng shutilmô-đun

shutil.copyfile Chữ ký

shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)

# example    
shutil.copyfile('source.txt', 'destination.txt')

shutil.copy Chữ ký

shutil.copy(src_file, dest_file, *, follow_symlinks=True)

# example
shutil.copy('source.txt', 'destination.txt')

shutil.copy2 Chữ ký

shutil.copy2(src_file, dest_file, *, follow_symlinks=True)

# example
shutil.copy2('source.txt', 'destination.txt')  

shutil.copyfileobj Chữ ký

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) Sao chép tập tin bằng osmô-đun

os.popen Chữ ký

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 Chữ ký

os.system(command)


# In Linux/Unix
os.system('cp source.txt destination.txt')  

# In Windows
os.system('copy source.txt destination.txt')

3) Sao chép tập tin bằng subprocessmô-đun

subprocess.call Chữ ký

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 Chữ ký

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
Sử dụng các lệnh đơn chuỗi là kiểu mã hóa xấu (tính linh hoạt, độ tin cậy và bảo mật), thay vào đó sử dụng ['copy', sourcefile, destfile]cú pháp bất cứ khi nào có thể, đặc biệt nếu các tham số là từ đầu vào của người dùng.
Marcel Waldvogel

8
Tại sao bạn liệt kê rất nhiều lựa chọn thay thế xấu cho các chức năng sao chép tắt?
maxschlepzig

6
Shutil được tích hợp sẵn, không cần cung cấp các lựa chọn thay thế không di động. Câu trả lời có thể thực sự được cải thiện bằng cách loại bỏ các giải pháp phụ thuộc hệ thống và sau khi loại bỏ, câu trả lời này chỉ là một bản sao của các câu trả lời hiện có / bản sao của tài liệu.
Jean-François Fabre

3
os.popenbây giờ không được dùng nữa và check_outputkhông trả lại trạng thái nhưng đầu ra (trong trường hợp trống copy/cp)
Jean-François Fabre

2
shutil không thực sự sao chép các tập tin. Có một cảnh báo lớn về chất béo ngay trên đầu của các tài liệu . "điều này có nghĩa là chủ sở hữu và nhóm tệp bị mất cũng như ACL. Trên Mac OS, tài nguyên ngã ba và siêu dữ liệu khác không được sử dụng. Điều này có nghĩa là tài nguyên sẽ bị mất và loại tệp và mã người tạo sẽ không chính xác. Trên Windows, chủ sở hữu tệp, ACL và luồng dữ liệu thay thế không được sao chép. "
gman

96

Sao chép một tập tin là một hoạt động tương đối đơn giản như được hiển thị bởi các ví dụ dưới đây, nhưng thay vào đó bạn nên sử dụng mô-đun stdlib đóng cửa cho điều đó.

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)

Nếu bạn muốn sao chép theo tên tệp, bạn có thể làm một cái gì đó như thế này:

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
Tôi đã nhận thấy một thời gian trước rằng mô-đun được gọi là shutil (số ít) và không tắt (số nhiều), và thực sự nó trong Python 2.3. Tuy nhiên, tôi để chức năng này ở đây là một ví dụ.
pi.

4
Sao chép nội dung của tệp là một thao tác đơn giản. Sao chép tệp bằng siêu dữ liệu của nó là bất cứ điều gì nhưng đơn giản, thậm chí còn hơn thế nếu bạn muốn đa nền tảng.
LaC

3
Thật. Nhìn vào các tài liệu tắt, hàm copyfile cũng sẽ không sao chép siêu dữ liệu.
pi.

3
Có, tôi không chắc tại sao bạn sẽ không sao chép nguồn của shutil.copyfileobj. Ngoài ra, bạn không có bất kỳ try, finallyxử lý nào để đóng các tệp sau khi có ngoại lệ. Tuy nhiên, tôi muốn nói rằng chức năng của bạn không nên chịu trách nhiệm mở và đóng các tệp. Điều đó sẽ đi trong một chức năng bao bọc, như cách shutil.copyfilekết thúc tốt đẹp shutil.copyfileobj.
ErlVolton

2
Đoạn mã trên phải chỉ định destđể có thể ghi:open(dest, 'wb')
user1016274

69

Sử dụng mô-đun đóng cửa .

copyfile(src, dst)

Sao chép nội dung của tệp có tên src vào một tệp có tên dst. Vị trí đích phải có thể ghi được; nếu không, một ngoại lệ IOError sẽ được đưa ra. Nếu dst đã tồn tại, nó sẽ được thay thế. Các tập tin đặc biệt như ký tự hoặc thiết bị khối và đường ống không thể được sao chép với chức năng này. src và dst là tên đường dẫn được cho dưới dạng chuỗi.

Hãy nhìn vào filesys cho tất cả các chức năng tập tin và xử lý thư mục có sẵn trong module Python chuẩn.


shutil không thực sự sao chép các tập tin. Có một cảnh báo lớn về chất béo ngay trên đầu của các tài liệu . "điều này có nghĩa là chủ sở hữu và nhóm tệp bị mất cũng như ACL. Trên Mac OS, tài nguyên ngã ba và siêu dữ liệu khác không được sử dụng. Điều này có nghĩa là tài nguyên sẽ bị mất và loại tệp và mã người tạo sẽ không chính xác. Trên Windows, chủ sở hữu tệp, ACL và luồng dữ liệu thay thế không được sao chép. "
gman

47

Ví dụ sao chép thư mục và tệp - Từ công cụ Python của 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"

24

Đầu tiên, tôi đã thực hiện một loạt các phương pháp đóng cửa để bạn tham khảo.

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',]
}

Thứ hai, giải thích các phương pháp sao chép trong exmaples:

  1. shutil.copyfileobj(fsrc, fdst[, length]) thao tác mở các đối tượng
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) Sao chép và đổi tên
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() Sao chép mà không cần đặt trước siêu dữ liệu
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() Sao chép với việc đặt trước siêu dữ liệu
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()

Đệ quy sao chép toàn bộ cây thư mục bắt nguồn từ src, trả về thư mục đích


1
shutil không thực sự sao chép các tập tin. Có một cảnh báo lớn về chất béo ngay trên đầu của các tài liệu . "điều này có nghĩa là chủ sở hữu và nhóm tệp bị mất cũng như ACL. Trên Mac OS, tài nguyên ngã ba và siêu dữ liệu khác không được sử dụng. Điều này có nghĩa là tài nguyên sẽ bị mất và loại tệp và mã người tạo sẽ không chính xác. Trên Windows, chủ sở hữu tệp, ACL và luồng dữ liệu thay thế không được sao chép. "
gman

19

Đối với các tệp nhỏ và chỉ sử dụng tích hợp python, bạn có thể sử dụng một lớp lót sau:

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

Như @maxschlepzig đã đề cập trong các bình luận bên dưới, đây không phải là cách tối ưu cho các ứng dụng có tệp quá lớn hoặc khi bộ nhớ quan trọng, do đó , câu trả lời của Swati nên được ưu tiên.


3
Điều này đọc tệp nguồn hoàn chỉnh vào bộ nhớ trước khi ghi lại. Do đó, điều này không cần thiết gây lãng phí bộ nhớ cho tất cả các hoạt động sao chép tệp nhỏ nhất.
maxschlepzig

1
Điều đó có đúng không? Tôi nghĩ .read().write()được đệm theo mặc định (ít nhất là cho CPython).
soundstripe

@soundstripe, Tất nhiên điều này là đúng. Thực tế là đối tượng tệp được trả về bởi open()IO được đệm, theo mặc định không giúp bạn ở đây, vì read()được chỉ định là: 'Nếu n âm hoặc bị bỏ qua, hãy đọc cho đến khi EOF.' Điều đó có nghĩa là read()trả về nội dung tệp hoàn chỉnh dưới dạng chuỗi.
maxschlepzig

@maxschlepzig Tôi hiểu ý của bạn và tôi thừa nhận tôi đã không biết về điều đó. Lý do tôi cung cấp câu trả lời này là trong trường hợp ai đó muốn thực hiện một bản sao tệp đơn giản chỉ sử dụng các phần dựng sẵn mà không cần nhập mô-đun cho nó. Tất nhiên tối ưu hóa bộ nhớ không phải là một mối quan tâm nếu bạn muốn tùy chọn này. Dù sao cũng cảm ơn bạn đã xóa nó ra. Tôi cập nhật câu trả lời cho phù hợp.
màu vàng01

14

Bạn đã có thể sử dụng os.system('cp nameoffilegeneratedbyprogram /otherdirectory/')

hoặc như tôi đã làm nó,

os.system('cp '+ rawfile + ' rawdata.dat')

Ở đâu rawfile là tên mà tôi đã tạo ra bên trong chương trình.

Đây là một giải pháp duy nhất của Linux


10
Đây không phải là di động, và không cần thiết vì bạn chỉ có thể sử dụng tắt máy.
Corey Goldberg

4
Ngay cả khi shutilkhông có sẵn - subprocess.run() (không có shell=True!) Là sự thay thế tốt hơn os.system().
maxschlepzig

1
Shutil dễ mang theo hơn
Hiadore 12/03/19

1
subprocess.run()như được đề xuất bởi @maxschlepzig là một bước tiến lớn, khi gọi các chương trình bên ngoài. Tuy nhiên, để linh hoạt và bảo mật, hãy sử dụng ['cp', rawfile, 'rawdata.dat']hình thức chuyển dòng lệnh. (Tuy nhiên, để sao chép shutilvà bạn bè được khuyến nghị nên gọi một chương trình bên ngoài.)
Marcel Waldvogel

2
Hãy thử điều đó với tên tệp có khoảng trắng trong đó.
Jean-François Fabre

11

Đối với các tệp lớn, những gì tôi đã làm là đọc từng dòng tệp và đọc từng dòng thành một mảng. Sau đó, khi mảng đạt đến một kích thước nhất định, hãy thêm nó vào một tệp mới.

for line in open("file.txt", "r"):
    list.append(line)
    if len(list) == 1000000: 
        output.writelines(list)
        del list[:]

2
điều này có vẻ hơi dư thừa vì người viết nên xử lý bộ đệm. for l in open('file.txt','r'): output.write(l)Nên tìm việc; chỉ cần thiết lập bộ đệm luồng đầu ra theo nhu cầu của bạn. hoặc bạn có thể đi bằng các byte bằng cách lặp qua một thử với output.write(read(n)); output.flush()nơi nlà số byte mà bạn muốn ghi tại một thời điểm. cả hai điều này cũng không có điều kiện để kiểm tra xem đó là phần thưởng.
sở hữu

1
Có, nhưng tôi nghĩ rằng có lẽ điều này có thể dễ hiểu hơn vì nó sao chép toàn bộ các dòng chứ không phải là một phần của chúng (trong trường hợp chúng ta không biết mỗi dòng có bao nhiêu byte).
ytpillai

Rất đúng. Mã hóa cho giảng dạy và mã hóa cho hiệu quả là rất khác nhau.
sở hữu

1
nhìn vào nguồn - các danh sách cuộc gọi viết, hg.python.org/cpython/file/c6880edaf6f3/Modules/_io/bytesio.c . Ngoài ra, luồng tệp đã được mở, do đó, ghi sẽ không cần mở lại mỗi lần.
sở hữu

2
Điều này thật kinh khủng. Nó không làm việc không cần thiết mà không có lý do chính đáng. Nó không hoạt động cho các tập tin tùy ý. Bản sao không giống hệt byte nếu đầu vào có kết thúc dòng bất thường trên các hệ thống như Windows. Tại sao bạn nghĩ rằng điều này có thể dễ hiểu hơn một cuộc gọi đến chức năng sao chép trong shutil? Ngay cả khi bỏ qua shutil, một vòng lặp đọc / ghi khối đơn giản (sử dụng IO không có bộ đệm) vẫn thẳng tiến, sẽ hiệu quả và có ý nghĩa hơn nhiều so với điều này, và do đó chắc chắn sẽ dễ dạy và hiểu hơn.
maxschlepzig

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

10
Điều này phụ thuộc vào nền tảng, vì vậy tôi sẽ không sử dụng.
Kevin Meier

5
Như vậy calllà không an toàn. Vui lòng tham khảo tài liệu phụ về nó.
buhtz

2
Đây không phải là di động, và không cần thiết vì bạn chỉ có thể sử dụng tắt máy.
Corey Goldberg

2
Hmm tại sao Python, sau đó?
Baris Demiray

Có thể phát hiện hệ điều hành trước khi khởi động (dù là DOS hay Unix, vì đó là hai hệ thống được sử dụng nhiều nhất)
MilkyWay90

8

Kể từ Python 3.5, bạn có thể thực hiện các thao tác sau đối với các tệp nhỏ (ví dụ: tệp văn bản, tệp jpeg nhỏ):

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 sẽ ghi đè lên bất cứ thứ gì ở vị trí của điểm đến


2
Và sau đó ai đó sử dụng mã (vô tình hoặc cố ý) trên một tệp lớn, Sử dụng các hàm từ shutilxử lý tất cả các trường hợp đặc biệt cho bạn và giúp bạn yên tâm.
Marcel Waldvogel

4
ít nhất nó không lặp lại các giải pháp tương tự lặp đi lặp lại.
Jean-François Fabre

6
open(destination, 'wb').write(open(source, 'rb').read())

Mở tệp nguồn ở chế độ đọc và ghi vào tệp đích ở chế độ ghi.


1
Ý tưởng này rất hay và mã rất đẹp, nhưng một hàm copy () thích hợp có thể làm được nhiều việc hơn, chẳng hạn như sao chép các thuộc tính (+ x bit) hoặc ví dụ xóa các byte đã được sao chép trong trường hợp tìm thấy một điều kiện đầy đĩa .
Raúl Salinas-Monteagudo

1
Tất cả các câu trả lời cần giải thích, ngay cả khi đó là một câu. Không có lời giải thích nào đặt ra tiền lệ xấu và không hữu ích trong việc hiểu chương trình. Điều gì sẽ xảy ra nếu một noob Python hoàn chỉnh xuất hiện và thấy điều này, muốn sử dụng nó, nhưng không thể vì họ không hiểu nó? Bạn muốn hữu ích cho tất cả trong câu trả lời của bạn.
Trình kết nối

1
Không phải là thiếu .close()những thứ open(...)đó sao?
luckydonald

Không cần .close (), vì chúng tôi KHÔNG LƯU TRỮ đối tượng con trỏ tệp ở bất cứ đâu (không phải cho tệp src cũng như cho tệp đích).
S471

1
Cách tiếp cận lãng phí bộ nhớ tối ưu tương tự như câu trả lời của yellow01 .
maxschlepzig

-3

Python cung cấp các hàm dựng sẵn để dễ dàng sao chép các tệp bằng các tiện ích Shell của Hệ điều hành.

Lệnh sau được sử dụng để Sao chép tệp

shutil.copy(src,dst)

Lệnh sau được sử dụng để Sao chép tệp với Thông tin MetaData

shutil.copystat(src,dst)

Bạn nên chạy copysau đó copystatđể bảo vệ siêu dữ liệu tập tin. Trong Python 3.3+ copystatcũng sao chép các thuộc tính mở rộng.
ingyhere
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.