Как мне скопировать файл в Python? - PullRequest
1918 голосов
/ 23 сентября 2008

Как мне скопировать файл в Python?

Я не смог найти ничего под os.

Ответы [ 15 ]

2360 голосов
/ 23 сентября 2008

shutil имеет много методов, которые вы можете использовать. Один из которых:

from shutil import copyfile

copyfile(src, dst)

Скопируйте содержимое файла с именем src в файл с именем dst. Место назначения должно быть доступно для записи; в противном случае возникнет исключение IOError. Если dst уже существует, он будет заменен. Специальные файлы, такие как символьные или блочные устройства и каналы, не могут быть скопированы с этой функцией. src и dst - имена путей, заданные в виде строк.

868 голосов
/ 20 мая 2015
┌──────────────────┬───────────────┬──────────────────┬──────────────┬───────────┐
│     Function     │Copies metadata│Copies permissions│Can use buffer│Dest dir OK│
├──────────────────┼───────────────┼──────────────────┼──────────────┼───────────┤
│shutil.copy       │      No       │        Yes       │    No        │    Yes    │
│shutil.copyfile   │      No       │        No        │    No        │    No     │
│shutil.copy2      │      Yes      │        Yes       │    No        │    Yes    │
│shutil.copyfileobj│      No       │        No        │    Yes       │    No     │
└──────────────────┴───────────────┴──────────────────┴──────────────┴───────────┘
650 голосов
/ 23 сентября 2008

copy2(src,dst) часто более полезно, чем copyfile(src,dst), потому что:

  • позволяет dst быть каталогом (вместо полного целевого имени файла), в этом случае для создания нового файла используется basename из src;
  • он сохраняет исходную информацию о модификации и доступе (mtime и atime) в метаданных файла (однако это сопровождается незначительными издержками).

Вот краткий пример:

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
89 голосов
/ 09 июля 2017

Вы можете использовать одну из функций копирования из пакета shutil:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Function              preserves     supports          accepts     copies other
                      permissions   directory dest.   file obj    metadata  
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
<a href="https://docs.python.org/3/library/shutil.html#shutil.copy" rel="noreferrer">shutil.copy</a>              ✔             ✔                 ☐           ☐
<a href="https://docs.python.org/3/library/shutil.html#shutil.copy2" rel="noreferrer">shutil.copy2</a>             ✔             ✔                 ☐           ✔
<a href="https://docs.python.org/3/library/shutil.html#shutil.copyfile" rel="noreferrer">shutil.copyfile</a>          ☐             ☐                 ☐           ☐
<a href="https://docs.python.org/3/library/shutil.html#shutil.copyfileobj" rel="noreferrer">shutil.copyfileobj</a>       ☐             ☐                 ✔           ☐
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Пример:

import shutil
shutil.copy('/etc/hostname', '/var/tmp/testhostname')
88 голосов
/ 24 сентября 2008

Копирование файла является относительно простой операцией, как показано в примерах ниже, но вместо этого вы должны использовать для этого модуль 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)
67 голосов
/ 22 января 2018

В Python вы можете копировать файлы, используя


import os
import shutil
import subprocess

1) Копирование файлов с использованием 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)  

2) Копирование файлов с использованием 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')

3) Копирование файлов с использованием 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)

60 голосов
/ 23 сентября 2008

Используйте модуль shutil .

copyfile(src, dst)

Скопируйте содержимое файла с именем src в файл с именем dst. Место назначения должно быть доступно для записи; в противном случае возникнет исключение IOError. Если dst уже существует, он будет заменен. Специальные файлы, такие как символьные или блочные устройства и каналы, не могут быть скопированы с помощью этой функции. src и dst - это имена путей, заданные в виде строк.

Посмотрите на filesys для всех функций обработки файлов и каталогов, доступных в стандартных модулях Python.

45 голосов
/ 15 марта 2011

Пример копирования каталога и файла - из материала Python Тима Голдена:

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"
14 голосов
/ 20 декабря 2014

Вы можете использовать os.system('cp nameoffilegeneratedbyprogram /otherdirectory/')

или, как я это сделал,

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

где rawfile - это имя, которое я сгенерировал внутри программы.

Это решение только для Linux

13 голосов
/ 15 августа 2017

Для небольших файлов и использования только встроенных Python, вы можете использовать следующую однострочную:

with open(source, 'r') as src, open(dest, 'w') as dst: dst.write(src.read())

Как @maxschlepzig упомянул в комментариях ниже, это не оптимальный способ для приложений, где файл слишком велик или когда память критична, поэтому ответ Swati предпочтительнее.

...