Найти - Пользователи
Полная версия: Как переместить файл вместе со структурой папок ?
Начало » Python для новичков » Как переместить файл вместе со структурой папок ?
1
Luke
Есть ли функция которая может “перезаписать имеющийся файл, проверить структуру папок получателя и если она недостаточна для выполнения копирования, то автоматически дополнить ее”.
shutil.move(src,dst) может только перезаписать имеющийся файл.
import shutil
shutil.move('D:\Python27\sip\PyQt4\QtCore\qvector.sip','D:\backup\Python27\sip\PyQt4\QtCore\qvector.sip')
Получаю ошибку если нет папки D:\backup или любой из следующих.
Неужели такую функциональность надо реализовывать самому ? (это лишние баги)
smoke853
имхо не вижу смысла писать функцию, нету папки или дерева папок? создать не сложно:
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\\')
Luke
Придется вырезать имя файла у всего списка файлов, надеюсь os.makedirs не уничтожает ничего если вдруг такая папка уже есть и не пуста.
Ну вот почему бы не включить такое поведение в стандартную функцию.
Luke
Мда несложно называется, вызывает кучу ошибок, срабатывает только 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')
тут еще как то надо прикрутить проверки на существование папок, ещё и рекурсивно.
Подскажите как файлы по списку listfile переместить в testbackup с путями.
pyuser
как-то так:
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))
Luke
Видимо я плохо объяснил что хотел. Ваш вариант ,как я понял, на вход требует две папки и потом перемещает файлы из одной в другую (вместе с поддиректориями), аналогично как если просто скопировать папку в Windows.
Мне же нужно было перемещать файлы из списка, файлы никак не связаны между собой (то есть они НЕ находятся в одной папке). Список содержит полные имена файлов и конечные полные имена (см. первый пост)
Но всё оказалось действительно не сложно
if not os.path.isdir(target):  os.makedirs(target)
решает проблемы.
Тему можно закрыть.
Sshikaree
os.renames(source, target)
Создаст необходимые директории на пути к target.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB