Форум сайта python.su
3
Есть ли функция которая может “перезаписать имеющийся файл, проверить структуру папок получателя и если она недостаточна для выполнения копирования, то автоматически дополнить ее”.
shutil.move(src,dst) может только перезаписать имеющийся файл.
import shutil shutil.move('D:\Python27\sip\PyQt4\QtCore\qvector.sip','D:\backup\Python27\sip\PyQt4\QtCore\qvector.sip')
Офлайн
15
имхо не вижу смысла писать функцию, нету папки или дерева папок? создать не сложно:
import os, shutil os.makedirs('D:\\backup\\Python27\\sip\\PyQt4\\QtCore\\') shutil.copy('D:\\Python27\\sip\\PyQt4\\QtCore\\qvector.sip', 'D:\\backup\\Python27\\sip\\PyQt4\\QtCore\\')
Офлайн
3
Придется вырезать имя файла у всего списка файлов, надеюсь os.makedirs не уничтожает ничего если вдруг такая папка уже есть и не пуста.
Ну вот почему бы не включить такое поведение в стандартную функцию.
Офлайн
3
Мда несложно называется, вызывает кучу ошибок, срабатывает только 1 раз и для 1 файла когда еще нет структуры папок.
Вот код для примера
# -*- coding: cp1251 -*- import sys import os # import os.path import shutil def ask_ok(prompt=u"[Y(да)/N(нет)] ?", retries=3, pretense=u"Введите 'Y' чтобы ответить 'да', или 'N' для ответа 'нет' !"): u"Задает вопрос пользователю, в зависимости от ответа возвращает true или false" try: in_encoding=sys.stdin.encoding #такого свойства может не быть if in_encoding==None: raise # или может вернуть None except: in_encoding='cp1251' # или utf-8 для unix, хотя сюда не должно попадать на unix while True: print prompt, #запятая чтобы убрать перевод строки ans=raw_input() ans=''.join(ans.split()) # это убирает пробелы, возвраты каретки, переводы строк (иногда появляются при вводе) if type(ans)==str: ans=unicode(ans,in_encoding) #защита от ошибки если входная строка уже юникод (так бывает) if ans in (u"y", u"Y", u"'Y'", u"yes", u"да"): return True if ans in (u"n", u"N", u"'N'", u"no", u"нет"): return False retries = retries - 1 if retries < 0: raise IOError('invalid user input') print pretense def main(): listfile=[[r"fortest.txt",r".\testbackup\fortest.txt"],\ [r"fortest1.txt",r".\testbackup\fortest1.txt"],\ [r".\fortestd\fortest.txt",r".\testbackup\fortestd\fortest.txt"],\ [r".\fortestd\fortest1.txt",r".\testbackup\fortestd\fortest1.txt"]] for record in listfile: tdir=os.path.dirname(record[1]) f=True while f: try: os.makedirs(tdir) shutil.move(record[0], tdir) f=False print u"переместил %s" % record[0] except IOError as err: print record[0], print err f=ask_ok(u"Повторить? [Y(да)/N(нет)] ?") if __name__ == '__main__': main() raw_input(u'Press Enter to exit')
Отредактировано Luke (Янв. 27, 2013 23:58:15)
Офлайн
36
как-то так:
import os import shutil def backup(root, target): # делаем относительные пути полными root = os.path.abspath(root) target = os.path.abspath(target) # проверяем существование приемника if not os.path.isdir(target): os.makedirs(target) for path, dirs, files in os.walk(root): for name in files: tmp, name = os.path.split(os.path.join(path, name)) dst_dir = os.path.join(target, os.path.relpath(tmp, root)) if not os.path.isdir(dst_dir): os.makedirs(dst_dir) shutil.move(os.path.join(tmp, name), os.path.join(dst_dir, name))
Отредактировано pyuser (Янв. 28, 2013 02:09:07)
Офлайн
3
Видимо я плохо объяснил что хотел. Ваш вариант ,как я понял, на вход требует две папки и потом перемещает файлы из одной в другую (вместе с поддиректориями), аналогично как если просто скопировать папку в Windows.
Мне же нужно было перемещать файлы из списка, файлы никак не связаны между собой (то есть они НЕ находятся в одной папке). Список содержит полные имена файлов и конечные полные имена (см. первый пост)
Но всё оказалось действительно не сложно
if not os.path.isdir(target): os.makedirs(target)
Офлайн
0
os.renames(source, target)
Офлайн