Добрый день.
Копирую файлы функцией shutil.copy
Может кто подскажет алгоритм для вывода статуса копирования (оставшееся время и процент завершения задачи)?
PatrikА по какому сетевому протоколу планируете копировать? И в какой операционной системе?
Я планирую копировать файлы по локальной сети, преимущественно все файлы большие (несколько Гб.).
john123Оно как раз должно подойти. Попробуйте.
Вообще самый простой способ копирования, например, указан вот здесь:
http://stackoverflow.com/a/1903753
target = open("//HOST/path/to/file")
print('\r%02d%%' % (copied * 100 / source_size))
sys.stdout.write('\r%02d%%' % (copied * 100 / source_size)) sys.stdout.flush()
PatrikДа, в этом случае попробуйте поставить размер блока побольше. Например поставьте число 65535.
Мне показалось, что процесс копирования очень долго идет, хотя поиграться с параметром копирования блока я не успел.
PatrikДа. Просто перед началом копирования Вам нужно будет посчитать и сложить размеры всех копируемых файлов. Эта сумма как раз и будет равняться прогрессу в 100 процентов.
По аналогии можно сделать и копирование нескольких файлов сделав функцию с параметрами, что копируем и куда.
PatrikА вот тут Вам придется проверять существование всех вложенных папок и, если каталог не создан, создать его.
Единственное, что я слабо представляю, что делать с папками.
file_dir = os.path.dirname(TARGET_FILENAME) if not os.path.exists(file_dir): os.makedirs(file_dir)
import os, sys def copyFiles(SRC_PATH, DST_PATH): total_files = 0 # всего файлов total_size = 0 # размер файла/ов if os.path.isfile(SRC_PATH): # если в SRC_PATH копирется файл total_size = os.stat(SRC_PATH).st_size # считаем размер файла srcpath = SRC_PATH dstpath = os.path.join(DST_PATH, os.path.basename(SRC_PATH)) # формируем путь, куда копируем total_files += 1 # счётчик файлов file_dir = os.path.dirname(dstpath) # обрезаем имя файла if not os.path.exists(file_dir): # проверяем существует ли путь os.makedirs(file_dir) # создаем недостающие папки print('copy', srcpath, 'to', dstpath) else: # иначе в SRC_PATH копируется папка for root, dirs, files in os.walk(SRC_PATH): # проходим по SRC_PATH рекурсивно for mkdir in root: print('Папки для создания', root) for root, dirs, files in os.walk(SRC_PATH): # проходим по SRC_PATH рекурсивно for name in files: srcpath = os.path.join(root, name) # получаем полное имя файла для его копирования dirr = os.path.relpath(root, SRC_PATH) # относительный путь dstpath = os.path.normpath(os.path.join(DST_PATH, dirr, name)) # формируем путь, куда копируем total_size += os.path.getsize(srcpath)# считаем размер файла total_files += 1 # счетчик файлов print('copy', srcpath, 'to', dstpath) print('total files:', total_files) print('total size', total_size)
for root, dirs, files in os.walk(SRC_PATH): # проходим по SRC_PATH рекурсивно for mkdir in root: print('Папки для создания', root)
copied = 0 source = open(srcpath, 'rb') target = open(dstpath, 'wb') while True: chunk = source.read(32768) if not chunk: break target.write(chunk) copied += len(chunk) sys.stdout.write('\r%02d%%' % (copied * 100 / source_size)) sys.stdout.flush() source.close() target.close()