Как использовать python для перезаписи всего каталога и его содержимого? - PullRequest
0 голосов
/ 31 октября 2018

Структура файла выглядит следующим образом:

/ EMAIL1 / спам

/ email2 / спам

/ email3 / спам ...

Теперь скопируйте все файлы из всех каталогов 'spam' в новый каталог / mail_data / spam

Я пытался использовать shutil.copytree, но он копирует только первый каталог (copytree требует, чтобы пункт назначения не существовал).

Затем я попробовал distutils.dir_util.copy_tree, оно работает, но я не знаю, почему каждый раз после его копирования появляются дубликаты файлов. (например, spam_email.txt, spam_email_1.txt). Там должно быть 15045 файлов, но копия кода 16545, которые еще 1500 ...

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Наконец, я обнаружил, что rsync очень прост в использовании, как сказал metatoaster, просто используйте os.system ( команда ).

На самом деле distutils.dir_util.copy_tree также работает, ошибки копирования не происходит, в исходном каталоге есть дубликаты файлов ...

0 голосов
/ 31 октября 2018

Я бы предложил использовать метод shutil.copytree() & shutil.copy(), как описано здесь в комбинации с rsync см. this

Вот не проверенный полный пример для вставки копии:

#!/usr/bin/env python3
import fileinput, os, fnmatch, re, io, errno, shutil
import ignore_patterns from shutil

errorMsgSrc = "Source File does exists, continuing using rsync ..."

def CopyFolder(src, dest):
    try:
        if not os.path.exists(dest):
            shutil.copytree(src, dest, ignore= ignore_patterns('*.json', '*.css', '*.scss', '*.js', '*.jpg', '*.png', '*.xcf'))
            print(errorMsgSrc.rstrip())
        if os.path.exists(dest):
            # Now choose your weapons for overwriting
            # maybe you wanna change working directory with e.g., os.chdir(dir)
            # -arv (archive, recursively and verbose)
            # make sure you got the slashes correct here
            assert os.system("rsync -arv " + src + " " + dest), "ERROR rsync step failed"
            # either delete the source file or use rsync with os.system

    except OSError as e:
    # If the error was caused because the source wasn't a directory
        if e.errno == errno.ENOTDIR:
            shutil.copy(src, dest)
        else:
            print('Directory not copied. Error: %s' % e)

if __name__ == '__main__':
    CopyFolder("source/", "~/home/usr/Desktop/")
0 голосов
/ 31 октября 2018

Вы можете сделать os.walk и спросить, является ли корень спамом, и только потом скопировать файл с помощью shutil.

Возможно, не самый эффективный способ, но вполне разумный. Другой способ - использовать os.system, например, с:

find . --path *spam | xargs -I {} cp -r {} ./spam

Не подтверждено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...