Рекурсивно копировать файл или каталоги в Python

В Python есть функции для копирования файлов (например, shutil.copy) и функции для копирования каталогов (например, shutil.copytree) но я не нашел ни одной функции, которая обрабатывает оба. Конечно, банально проверить, хотите ли вы скопировать файл или каталог, но это кажется странным упущением.

Действительно ли нет стандартной функции, которая бы работала, как команда unix cp -r, то есть поддерживает и каталоги, и файлы, и рекурсивно копирует? Каков самый элегантный способ обойти эту проблему в Python?

101 голос | спросил pafcu 3 Jpm1000000pmSun, 03 Jan 2010 13:06:42 +030010 2010, 13:06:42

11 ответов


0

Предлагаю сначала позвонить shutil.copytree и, если возникнет исключение, повторите попытку с shutil.copy .

import shutil, errno

def copyanything(src, dst):
    try:
        shutil.copytree(src, dst)
    except OSError as exc: # python >2.5
        if exc.errno == errno.ENOTDIR:
            shutil.copy(src, dst)
        else: raise
ответил tzot 3 Jpm1000000pmSun, 03 Jan 2010 15:35:25 +030010 2010, 15:35:25
0

Я предлагаю вам сначала позвонить в shutil.copytree и, если возникнет исключение, повторите попытку с shutil.copy .

import shutil, errno

def copyanything(src, dst):
    try:
        shutil.copytree(src, dst)
    except OSError as exc: # python >2.5
        if exc.errno == errno.ENOTDIR:
            shutil.copy(src, dst)
        else: raise
ответил tzot 3 Jpm1000000pmSun, 03 Jan 2010 15:35:25 +030010 2010, 15:35:25
0

Чтобы добавить Tzot's и gns отвечает, вот альтернативный способ рекурсивного копирования файлов и папок. (Python 3.X)

import os, shutil

root_src_dir = r'C:\MyMusic'    #Path/Location of the source directory
root_dst_dir = 'D:MusicBackUp'  #Path to the destination folder

for src_dir, dirs, files in os.walk(root_src_dir):
    dst_dir = src_dir.replace(root_src_dir, root_dst_dir, 1)
    if not os.path.exists(dst_dir):
        os.makedirs(dst_dir)
    for file_ in files:
        src_file = os.path.join(src_dir, file_)
        dst_file = os.path.join(dst_dir, file_)
        if os.path.exists(dst_file):
            os.remove(dst_file)
        shutil.copy(src_file, dst_dir)

Если вы впервые, и вы не знаете, как рекурсивно копировать файлы и папки, надеюсь, это поможет.

ответил mondieki 4 MarpmSat, 04 Mar 2017 14:37:59 +03002017-03-04T14:37:59+03:0002 2017, 14:37:59
0

Unix cp не поддерживает как каталоги, так и файлы:

betelgeuse:tmp james$ cp source/ dest/
cp: source/ is a directory (not copied).

Чтобы cp скопировал каталог, вы должны вручную указать cp, что это каталог, с помощью флага '-r'.

Здесь есть некоторое разъединение - cp -r при передаче имени файла, поскольку источник с радостью скопирует только один файл; copytree не будет.

ответил James Polley 3 Jpm1000000pmSun, 03 Jan 2010 13:17:22 +030010 2010, 13:17:22
0

Unix cp не поддерживает как каталоги, так и файлы:

betelgeuse:tmp james$ cp source/ dest/
cp: source/ is a directory (not copied).

Чтобы cp скопировал каталог, вы должны вручную указать cp, что это каталог, с помощью флага '-r'.

Здесь есть некоторое разъединение - cp -r при передаче имени файла, поскольку источник с радостью скопирует только один файл; copytree не будет.

ответил James Polley 3 Jpm1000000pmSun, 03 Jan 2010 13:17:22 +030010 2010, 13:17:22
0

shutil.copy и shutil.copy2 копируют файлы.

shutil.copytree копирует папку со всеми файлами и всеми подпапками. shutil.copytree использует shutil.copy2 для копирования файлов .

То есть аналог cp -r, который вы говорите, это shutil.copytree, потому что cp -r предназначается и копирует папку и ее файлы /подпапки, такие как shutil.copytree. Без -r cp копирует файлы типа ---- +: = 11 =: + ---- и shutil.copy do.

ответил gms 15 FebruaryEurope/MoscowbWed, 15 Feb 2017 15:37:00 +0300000000pmWed, 15 Feb 2017 15:37:00 +030017 2017, 15:37:00
0

shutil.copy и shutil.copy2 копируют файлы.

shutil.copytree копирует папку со всеми файлами и всеми подпапками. shutil.copytree использует shutil.copy2 для копирования файлов .

То есть аналог cp -r, который вы говорите, это shutil.copytree, потому что cp -r предназначается и копирует папку и ее файлы /подпапки, такие как shutil.copytree. Без -r cp копирует файлы типа ---- +: = 11 =: + ---- и shutil.copy do.

ответил gms 15 FebruaryEurope/MoscowbWed, 15 Feb 2017 15:37:00 +0300000000pmWed, 15 Feb 2017 15:37:00 +030017 2017, 15:37:00
0

Я думаю, что copy_tree - это то, что вы ищете

ответил algorythms 18 J0000006Europe/Moscow 2018, 18:51:04
0

Я думаю, что copy_tree - это то, что вы ищете

ответил algorythms 18 J0000006Europe/Moscow 2018, 18:51:04
0

Метод python shutil.copytree беспорядок. Я сделал один, который работает правильно:

def copydirectorykut(src, dst):
    os.chdir(dst)
    list=os.listdir(src)
    nom= src+'.txt'
    fitx= open(nom, 'w')

    for item in list:
        fitx.write("%s\n" % item)
    fitx.close()

    f = open(nom,'r')
    for line in f.readlines():
        if "." in line:
            shutil.copy(src+'/'+line[:-1],dst+'/'+line[:-1])
        else:
            if not os.path.exists(dst+'/'+line[:-1]):
                os.makedirs(dst+'/'+line[:-1])
                copydirectorykut(src+'/'+line[:-1],dst+'/'+line[:-1])
            copydirectorykut(src+'/'+line[:-1],dst+'/'+line[:-1])
    f.close()
    os.remove(nom)
    os.chdir('..')
ответил kutenzo 1 PM00000030000000831 2016, 15:25:08
0

Метод python shutil.copytree беспорядок. Я сделал один, который работает правильно:

def copydirectorykut(src, dst):
    os.chdir(dst)
    list=os.listdir(src)
    nom= src+'.txt'
    fitx= open(nom, 'w')

    for item in list:
        fitx.write("%s\n" % item)
    fitx.close()

    f = open(nom,'r')
    for line in f.readlines():
        if "." in line:
            shutil.copy(src+'/'+line[:-1],dst+'/'+line[:-1])
        else:
            if not os.path.exists(dst+'/'+line[:-1]):
                os.makedirs(dst+'/'+line[:-1])
                copydirectorykut(src+'/'+line[:-1],dst+'/'+line[:-1])
            copydirectorykut(src+'/'+line[:-1],dst+'/'+line[:-1])
    f.close()
    os.remove(nom)
    os.chdir('..')
ответил kutenzo 1 PM00000030000000831 2016, 15:25:08

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132