Уведомления

Группа в Telegram: @pythonsu

#1 Июль 5, 2014 20:05:53

john123
Зарегистрирован: 2013-12-22
Сообщения: 56
Репутация: +  7  -
Профиль   Отправить e-mail  

Копирование файлов

Patrik
1 Если файл копируется в папку, то все в порядке. Но если его придется копировать под другим именем,
как сделать шаблон?
Не совсем понятно, что Вы имеете в виду под “шаблоном”

Patrik
выдает много дубликатов, и не понятно как сопоставить с dstpath.
Patrik
3 Как сделать связку с :
Создавая каталоги вручную, Вы усложняете логику программы. При копировании больших файлов, лишний вызов os.makedirs() значения иметь не будет. Посему, предлагаю поступить так:
file_list = []
for root, dirs, files in os.walk(SRC_PATH):
    for name in files:
        path = root[len(SRC_PATH):]
        file_list.append(os.path.join(path, name))
После этого у Вас в списке file_list будут содержаться пути ко всем файлам, но не абсолютные, а относительные (потому что мы удаляем SRC_PATH из пути). Эти относительные пути Вы будете подставлять к DST_PATH, чтобы получить полный путь, куда нужно копировать.

Потом Вы просто пробегаетесь по списку file_list и выполняете в цикле свой код копирования.
Каталоги создавать предлагаю, как и раньше - вот так (в том же цикле копирования):
file_dir = os.path.dirname(list_item)
if not os.path.exists(file_dir):
    os.makedirs(file_dir)

Учитывая, что у Вас в алгоритме есть разветвление - копирование каталогов и копирование файлов - для файла поступайте точно таким же образом - создавайте на основе пути к файлу список, содержащий один элемент - относительный путь к результирующему файлу и передавайте всё это в цикл копирования.

Получается примерно такой алгоритм (псевдокод):
file_list = []
    
# Определяем каталог это или файл
if os.path.isfile(SRC_PATH):
    file_list.append(os.path.basename(SRC_PATH)) # Из пути SRC_PATH берем только имя файла
else:
    for a, b, c in os.walk(SRC_PATH):
        file_list.append(...)
    
# Цикл копирования
for item in file_list:
    source = os.path.join(os.path.dirname(SRC_PATH), item) # Вот здесь может глючить, если в SRC_PATH передавать путь к каталогу и не завершать его символом '/'
    target = os.path.join(os.path.dirname(DST_PATH), item)
    
    # Создаем каталоги
    file_dir = os.path.dirname(target) 
    if not os.path.exists(file_dir):
        os.makedirs(file_dir)
    
    # Дальше идет сам код копирования
    ...

Отредактировано john123 (Июль 6, 2014 11:10:43)

Офлайн

#2 Июль 7, 2014 21:22:27

Patrik
От:
Зарегистрирован: 2011-04-21
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

Копирование файлов

john123: Под шаблоном я имел ввиду, выделение в пути имени файла.
Если файл копировать в папку, то тут все понятно. Но если, копировать в папку под другим именем, тут нужно как-то выделить из пути имя файла, чтобы создать

file_list = []
SRC_PATH="C:\test.txt"
DST_PATH="C:\test\proba.txt"
# Определяем каталог это или файл
if os.path.isfile(SRC_PATH):
    file_list.append(os.path.basename(SRC_PATH)) #  заносим имя файла в массив
# Цикл копирования
for item in file_list:
    source = os.path.join(os.path.dirname(SRC_PATH), item) # сформировали путь откуда копируем.
    target = os.path.join(os.path.dirname(DST_PATH), item) # тут получим C:\test\test.txt" хотя должны были получить C:\test\proba.txt

По идее нужно вводить условие target - это папка или файл. Может как-то по разделительной точке определять файл это или нет?

Каталоги вручную я начал создавать, так как если в копируемой папке присутствуют каталоги без файлов, то они не создадутся.



Офлайн

#3 Июль 22, 2014 21:53:10

Patrik
От:
Зарегистрирован: 2011-04-21
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

Копирование файлов

Копирую файлы с сети (smb) на флешку:

def CopyFile(srcpath, dstpath):
    """ Функция копирования файла """
    CHUCK_SIZE = 16384
    source_size = os.stat(srcpath).st_size
    print("Копируем ФАЙЛ...")
    try:
        source = open(srcpath, 'rb')
        target = open(dstpath, 'wb')
        try:
            while  target.tell() < source_size - 1:
                target.write(source.read(CHUCK_SIZE))
                target.flush()
                ProgressBar(dstpath, target.tell(), source_size) # вывод прогресс бара   
        finally:
            source.close()
            target.close()
    except IOError:
        print("Не могу открыть входящий или исходящий файл")

Как сделать проверку на случай, если сеть или файл-приёмник отвалится? Мне нужно, чтобы скрипт ждал 30 секунд, а потом снова пытался скопировать.



Отредактировано Patrik (Июль 22, 2014 21:53:48)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version